欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式之1——策略模式

程序员文章站 2022-06-13 13:47:14
...


生活案例
跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,关键是追MM锦囊中有好多Strategy哦。
计算机中的动机
而软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
概念
策略模式定义了算法家庭,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。————《设计模式》GOF

设计模式之1——策略模式


代码
Strategy类,定义所有支持的算法的公共接口

//抽象算法类
abstract class Strategy
{ 
    //算法方法
    public abstract void AlgorithmInteface();
}


ConcreteStrategy,封装了具体的算法或行为,继承于Strategy

//具体算法A
class ConcreteStrategyA : Strategy
{ 
    //算法A实现方法
    public override void AlgorithmInteface()
    {
        Console.WriteLine("算法A实现");
    }
}

//具体算法B
class ConcreteStrategyB : Strategy
{
    //算法B实现方法
    public override void AlgorithmInteface()
    {
        Console.WriteLine("算法B实现");
    }
}

//具体算法C
class ConcreteStrategyC : Strategy
{
    //算法C实现方法
    public override void AlgorithmInteface()
    {
        Console.WriteLine("算法C实现");
    }
}


Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用

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


客户端代码

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();
}


优缺点
优点
提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
缺点
因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
解决方案工厂方法