2018-06-07 孙小北

设计模式之策略模式(Strategy Pattern)

养浩然之气,做博学之人

策略模式(Strategy Pattern)也称政策模式,是一种可以在运行时选择算法的模式,存在多种不同的算法(每一种对应一个单独的类,每个类的功能不同)。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。

类型:行为型模式

主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。存在多种解决方案的问题。

具体方案:将这些算法封装成一个一个的类,任意地替换。实现同一个接口。

应用实例:

    1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。

    2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 

    3、JAVA AWT 中的 LayoutManager。

    4、商场搞促销,促销的方式有可能有很多:打折;满减,积分返利等。

    5、对数据排序,可选:冒泡排序,选择排序。。。等多种选择

    6、准考证生成模式:9位,11位等不同方案。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

公有行为的处理:经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。这其实也是典型的将代码向继承等级结构的上方集中的标准做法。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

实现:创建 Strategy 接口和实现了 Strategy 接口的实体策略类。

具体实现:

抽象策略类:通常由一个接口或者抽象类实现。定义一个所有算法都支持的通用接口,内容类会通过这个接口来调用由具体策略定义的各个方法。

public interface Strategy {
    public void strategyInterface();
}

具体策略类:每个具体策略都会实现相应的算法

public class ConcreteStrategyA implements Strategy {
    @Override   
    public void strategyInterface() {
        //A策略相关的业务
    }
}
public class ConcreteStrategyB implements Strategy {
    @Override
    public void strategyInterface() {
        //B策略相关的业务
    }
}
public class ConcreteStrategyC implements Strategy {
    @Override 
    public void strategyInterface() {
        //C策略相关的业务
    }
}

环境角色类(内容类/上下文):内容类包含对将要使用的具体策略对象的引用,内容类接收来自客户端的请求,并将其委托给策略类对象,通常具体的策略类由客户端创建,并传递给内容类。

public class Context {    
    //持有一个具体策略的对象
    private Strategy strategy;    
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象     
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }    
    /**
     * 策略方法     
     */
    public void contextInterface(){        
        strategy.strategyInterface();
    }    
}



参考:《JAVA与模式》《设计模式精解与面试攻略》

编辑:孙小北

本文地址: https://www.xiaowangyun.com/wyblog/detail/?id=183

版权归属: www.xiaowangyun.com   转载时请以链接形式注明出处

0 条评论

快来评论

物以类聚

最新评论

2017-10-06

一辈子不长,只有珍惜了,才不至于后悔。

2017-10-06

懂得感恩,才能走得更远。

标签云

归档

取消

感谢您的支持,您的每一次打赏都是一次鼓励!

扫码支持
每一次支持,都是不懈的动力

打开支付宝扫一扫,即可进行扫码打赏哦