策略模式:将经常变换的部分提取出来,对于调用者,便可动态改变对象的行为,被调用者的管理也会提高效率。
模式的应用,主要为提升对代码的复用、管理、移植。尤其是移植性,创建好的移植性能代码更有助于提升软件开发的意义。
举个栗子:
点菜-》付款-》开发票,这么一个日常的过程,拆解开也可以理解成如下方式
订单-》支付-》生成发票,这样一个流程,也是今天无论消费、金融最普遍的一个流程导向,过程是千变万化,本质还是一样的(不讨论冗余过程,仅仅以模式的角度看下如何实现)
第一步,创建订单,再细化些
#1:定义订单要素
#2:创建订单或者叫execute(现实中创建订单,考虑验证要素很多,暂不扩散思维)
#3:生成订单,返回结果(返回唯一订单编号)
第二步,支付
#1:拿着上一步的订单编号,校验支付基本信息
#2:开始支付或者叫execute(现实情况,支付场景要考虑很多,同步、异步等)
#3:返回支付结果
第三步,生成发票,同样
#1:根据上两步的基本信息,校验
#2:生成发票或者叫execute
#3:打印发票,拿票走人...
可以看出,每个过程都有一些共性,策略模式的应用,可以帮助减少代码的复杂度,省略如if else的使用
首先创建我们最想要的策略接口(实现依赖接口,没有接触过的同学多看看java设计思想),
public interface IProcessor<T>(){
T execute(Object...params);
}
有了接口,便可实现我们的策略了
1)订单策略
public class BaseOrderProcessor implements IProcessor<Object>(){
private String name;
...
public Object execute(Object...params){
verifyData(params);
....
createOrder(params);//创建订单
...
}
}
2)支付策略
public class PayProcessor implements IProcessor<Object>(){
private String name;
...
public Object execute(Object...params){
verifyData(params);
....
shortPay(params);//快捷支付
...
}
}
3)发票策略
public class BillProcessor implements IProcessor<Object>(){
private String name;
...
public Object execute(Object...params){
verifyData(params);
....
createBillr(params);//创建发票
...
}
}
有了这些工具策略后,就来建个工具箱嘛,毕竟乱丢工具不是什么好习惯
public class ProcessorBox(){
private IProcessor processor;
public void setProcessor(IProcessor processor){
this.processor=processor;
}
public IProcessor getProccessor(){
return this.processor;
}
public void use(){
//校验什么的不要少
processor.execute();
}
}
客户端调用:
ProcessorBox toolBox=new ProcessorBox();
toolBox.setProcessor(new BaseOrderProcessor());
toolBox.use(params);//订单创建
toolBox.setProcessor(new PayProcessor());
toolBox.use(params);//支付
toolBox.setProcessor(new BillProcessor());
toolBox.use(params);//开具发票
再来回想下,策略模式的定义,将经常变换的部分提取出来,对于调用者,便可动态改变对象的行为,被调用者的管理也会提高效率.over