策略模式

Posted aohost

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。

策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,并且这些算法可以相互替换,该模式使得算法可独立使用于它客户的而变化。

技术图片

 

 该模式有一个算法实现的抽象Strategy,它将不同的算法抽象了出来。具体的实现则在ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC中。然后有一个策略的上下文Context,它含有对Strategy的引用。通过ContextInterface()对具体算法进行调用。

我们先实现抽象算法类Strategy

技术图片
//抽象算法类
abstract class Strategy
{
    //算法方法
    public abstract void AlgorithmInterface();
}
View Code

 

 然后实现它的具体算法

技术图片
//具体算法A
class ConcreteStrategyA : Strategy
{
    //算法A实现方法
    public override void AlgorithmInterface()
    {
        Console.WriteLine("算法A实现");
    }
}
//具体算法B
class ConcreteStrategyB : Strategy
{
    //算法B实现方法
    public override void AlgorithmInterface()
    {
        Console.WriteLine("算法B实现");
    }
}
//具体算法C
class ConcreteStrategyC : Strategy
{
    //算法C实现方法
    public override void AlgorithmInterface()
    {
        Console.WriteLine("算法C实现");
    }
}
View Code

 

添加我们的上下文

技术图片
//上下文
class Context
{
    Strategy strategy;

    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }
    //上下文接口
    public void ContextInterface()
    {
        strategy.AlgorithmInterface();
    }
}
View Code

 

这样我们一个基本的策略模式就设计好了,我们只需要在不同场景下进行不同的调用就行了

技术图片
static void Main(string[] args)
{
    Context context;

    context = new Context(new ConcreteStrategyA());
    context.ContextInterface();

    context = new Context(new ConcreteStrategyB());
    context.ContextInterface();

    context = new Context(new ConcreteStrategyC());
    context.ContextInterface();

    Console.Read();
}
View Code

 

这样就实现了对不同算法实现的调用。策略模式还可以结合工厂模式使用,是代码更加灵活。重点就是修改我们的Context,让它支持工厂模式。

技术图片
class Context
{
    Strategy strategy;

    public Context(string type)
    {
        switch (type)
        {
            case "AlgorithmA":
                strategy = new ConcreteStrategyA();
                return;
            case "AlgorithmB":
                strategy = new ConcreteStrategyB();
                return;
            case "AlgorithmC":
                strategy = new ConcreteStrategyC();
                return;
            default:
                throw new Exception("Invalid Type");
        }
    }
    //上下文接口
    public void ContextInterface()
    {
        strategy.AlgorithmInterface();
    }
}
View Code

 

我们在使用的时候就可以通过简单工厂模式的方式去使用它

技术图片
static void Main(string[] args)
{
    Context context;

    context = new Context("AlgorithmA");
    context.ContextInterface();

    context = new Context("AlgorithmB");
    context.ContextInterface();

    context = new Context("AlgorithmC");
    context.ContextInterface();

    Console.Read();
}
View Code

 

策略模式是一种比较常见的设计模式,例如商场结账一个场景。都是结账,可能有的会打折,有的会原价,有的会满多少返多少,这就是不同的算法实现。

 

以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

用于从 cloudkit 检索单列的代码模式/片段

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式