设计模式之策略模式

策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变更,不会影响到算法的用户

 

 策略模式代码结构

//策略或者算法的接口
public interface Strategy {
    public void AlgorithmInterface();
}
//多种具体的策略或者算法
public class ConcreteStrategyA implements Strategy{

    public void AlgorithmInterface() {
        //实现细节A
    }
}

public class ConcreteStrategyB implements Strategy{

    public void AlgorithmInterface() {
        //实现细节B
    }
}

public class ConcreteStrategyC implements Strategy{

    public void AlgorithmInterface() {
        //实现细节C
    }
}
//持有策略对象的上下文
public class Context {
    Strategy strategy;
    //初始上下文时传入具体的策略对象
    public Context (Strategy strategy) {
        this.strategy = strategy;
    }
    //调用策略对象方法提供服务
    public void contextInterface() {
        strategy.AlgorithmInterface();
    }
}
//客户端调用
public class Main{
    public 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();     
    }
}    

 

策略模式适用于动态改变对象行为的场景,如商场结算(正常结算、打X折、满XX减YY等不同结算方式),出游方式(汽车、火车、飞机等不同交通工具),通过把行为抽象成公共接口,实现由具体算法执行。

策略模式不仅使算法代码得以重用,对客户端新的需求只需提供新的算法实现,无需修改源代码,满足OCP原则,而且简化了单元测试,因为每个算法都有自己的类,只需要完成对本身算法的测试即可。对服务端而言,也减少了业务逻辑与算法实现的耦合。

策略模式还可以与简单工厂模式结合,把对算法的选择实现转移到工厂当中,减轻客户端的职责

posted @ 2017-10-30 19:50  DeDeDi  阅读(126)  评论(0)    收藏  举报