二、策略模式-Strategy

策略模式(Strategy):它定义了算法家族,分别封装起来;其实就是用来封装算法的,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用此算法的客户;

在具体的实践中,策略模式可以封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式

1.抽象出共同的行为方法---算法
package com.zcbl.client.zcblsdk.strategymodel;

/**
 * Created by serenitynanian on 2018/2/2.
 * 抽象一个算法类
 * 定义一个算法行为
 */

public abstract class Strategy {

    public abstract  void algorithmInterface();
}
2.具体的算法A
package com.zcbl.client.zcblsdk.strategymodel;

/**
 * Created by serenitynanian on 2018/2/2.
 * 具体的算法A
 */

public class ConcreteStrategyA extends Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("算法A实现了");
    }
}
3.具体的算法 B
package com.zcbl.client.zcblsdk.strategymodel;

/**
 * Created by serenitynanian on 2018/2/2.
 * 具体的算法B
 */

public class ConcreteStrategyB extends Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("算法B实现了");
    }
}
4.具体的算法策略 --暴露给用户直接调用,使用户不必关系具体的算法
package com.zcbl.client.zcblsdk.strategymodel;

/**
 * Created by serenitynanian on 2018/2/2.
 * 具体的策略类
 */

public class ConcreteStrategy {

    private Strategy strategy ;

    public ConcreteStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    public void getConcreteInterface(){
        strategy.algorithmInterface();
    }


    public static void main(String[] args) {

        /**
         * 对于客户端来说 ,只需要知道ConcreteStrategy即可,不需要知道Strategy;
         * 只需要客户端实例化ConcreteStrategy对象,只需要调用客户端实例化ConcreteStrategy对象的方法,这使得
         * 具体的策略和和客户端彻底分离;
         */
        ConcreteStrategy contextStrategy ;

        contextStrategy = new ConcreteStrategy(new ConcreteStrategyA());
        contextStrategy.getConcreteInterface();

        contextStrategy = new ConcreteStrategy(new ConcreteStrategyB());
        contextStrategy.getConcreteInterface();
    }
}
5.总结

其实策略模式大致看下与上一篇文章:简单工厂很相似,但是简单工厂模式解决的对象的创建;而策略封装算法,使不同时间应用不同业务,使客户端与具体算法彻底分离

你可能感兴趣的:(二、策略模式-Strategy)