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