随笔篇-优化代码-策略+工厂+spi


前提:为解决 同一种业务逻辑下进行不同策略的引起的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 和维护工作

如果看官觉得有点用,点赞一下 鼓励一下我吧!

欢迎添加公众号与您分享更多记录
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值