码迷,mamicode.com
首页 > 其他好文 > 详细

策略模式

时间:2020-05-23 13:08:35      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:none   crete   his   closed   span   rate   ons   open   err   

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

技术图片

 

 该模式有一个算法实现的抽象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

 

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

 

策略模式

标签:none   crete   his   closed   span   rate   ons   open   err   

原文地址:https://www.cnblogs.com/aohost/p/12941871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!