`

策略模式

阅读更多
策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化

角色组成:
抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。 (一组类)
环境角色:持有一个策略类的引用,最终给客户端调用。

abstract class Strategy//抽象策略角色
{
    public abstract void algorithmInterface();
}

//具体策略角色
class ConcreteStrategyA extends Strategy
{
    public void algorithmInterface()
   {
      //算法A
   }
}
class ConcreteStrategyB extends Strategy
{
    public void algorithmInterface()
   {
      //算法B
   }
}

class Context//环境角色
{
    Strategy strategy;
    public Context(Strategy strategy)
    {
        this.strategy = strategy
    }
    //上下文接口
     public void contextInterface()
    {
        strategy.algorithmInterface();
    }
}
//可以看到,客户端还是需要给Context传入strategy,如果策略模式和简单工厂模式结合起来,就可以根据条件判断实例化哪个具体策略,这样一来,更像简单工厂模式了,但是他让客户端只认识一个Context类,而简单工厂模式需要客户端认识工厂类和抽象产品类两个类。


优点:
提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展
避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
守大部分GRASP原则和常用设计原则,高内聚、低偶合。

缺点:因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量

使用场景:
多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior)   
需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充)   
对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。(这估计得和简单工厂相结合)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics