前提:为解决 同一种业务逻辑下进行不同策略的引起的if else 的去掉和维护工作 提供灵感!
//以下是业务代码
//伪代码
public int computer( num,type ) {
if(type==1){//判断
num += type+10; //业务逻辑
}else if (type==2){//判断
num += type+20; //业务逻辑
}else if (type==3){//判断
num += type+30; //业务逻辑
}else if ......
}
想去掉if else 至少需要两个改变
策略
第一个改变 业务逻辑策略封装
因为 num 的加减 ,抽象来说就是对一个数数字进行计算,所以业务逻辑 统一的行为,我们抽象成一个 接口函数:
//伪代码
Interface Computer{
activonComputer()
}
class type1 Interface Computer{
public static int type=1
activonComputer(num){
num += type+10;
}
}
class type2 Interface Computer{
public static int type=2
activonComputer(num){
num += type+20;
}
}
class type3 Interface Computer{
public static int type=3
activonComputer(num){
num += type+30;
}
}
行为策略封装后代码:
//以下是业务代码
//伪代码
public int computer( num,type ) {
if(type1.type==1){//判断
new type1().activonComputer; //业务逻辑
}else if (type2.type==2){//判断
new type2().activonComputer; //业务逻辑
}else if (type3.type==3){//判断
new type3().activonComputer; //业务逻辑
}else if ......
}
工厂
第二个改变,new 这个动作也是一个抽象的动作,统一new ,还有个维护的问题,如果有个新的业务逻辑,代码需要在加上一个else if 的判断 然后new 一个行为策略对象,并且 这个代码 耦合了,耦合的是 创建 和使用, 业务代码中只有 调用activeComputer 方法才是业务需要的,换句话说new type1 这种代码不是业务。说到这里你早已经想到了工厂模式吧。
//伪代码
class factory{
Computer c1 = new type1();
Computer c2 = new type2();
Computer c3 = new type3();
public static Map map = new HashMap();
map.put(c1.type,c1);
map.put(c2.type,c2);
map.put(c3.type,c3);
}
此时的业务代码是:
//伪代码
public int computer( num,type ) {
return map.get(type).activonComputer(num);
此时完成了我们的目的,业务代码更加纯粹只关注业务,如果想要维护添加新的策略行为, 可以做到不修改业务代码前提下,仅仅对Computer 接口写个实现类,然后 factory 中 new 出实现类添加到map中!
spi 发现机制
可以在更近一步,不修改factory,我们稍微修改成这样
:
//伪代码
class factory{
public static Map map = new HashMap();
list list = Resource.load("配置文件");
for(String srt : list){
Computer c = Class.forName(srt);//反射
map.put(c.type,c);
}
}
配置文件内容:注意内容我想定义成类限定名字,你想怎么配置看你意愿
com.XXX.XXX.type1
com.XXX.XXX.type2
com.XXX.XXX.type3
com.XXX.XXX.type4
以后直接在配置文件中写类的全限定名字,会被工厂反射加载进去,这样又省去了修改factory 的代码了
现在我们维护扩展这个代码 仅仅对Computer 接口写个实现类!!!,并且想去掉某些策略,可以修改配置文件啦!!!
总结:
1策略体现在 if else 内部的逻辑抽象一个统一的动作,那么需要用接口,不同的业务动作,就是不同的接口实现类, 现在只是解决了内部逻辑抽象成了一个统一的对象,而且调用的时候 每次都是new 一个具体实现 然后调用,这里引出工厂模式。
2 工厂模式,所有对象的创建需要用一个统一的工厂来创建,这样以后,在业务代码中不需要做判断, 业务代码中应该是专门来使用对象,而工厂类代码中是专门创建对象,解耦 对象的 创建 与使用,业务代码更加纯粹的只有业务代码,这样的代码业务抽象逻辑不变的情况下,就做到了不修改业务代码的目的,仅仅修改工厂类即可,
3 不修改工厂类就做到添加功能,就不能用简单工厂,需要将硬编码的NEW 方式去掉,需要用工厂方法模式 将原来的new 硬编码,抽象出来一个行为,这就是工厂的接口,每个产品类的创建对应一个具体工厂的实现,具体工厂都是实现了抽象工厂,重写 new 硬编码的行为,然后添加一个配置文件添加工厂的名字,在启动的时候,在配置文件中加载名字 反射new 出产品! 就可以彻底解决if else 和维护工作
如果看官觉得有点用,点赞一下 鼓励一下我吧!
欢迎添加公众号与您分享更多记录