1.情景介绍
/*
*
*
* 具体改造过多的if-else
*
* if(张三){
* //张三业务
* System.out.println("张三业务执行");
* //
* }else if(李四业务){
* //李四业务
* System.out.println("李四业务执行");
* //
* }else if(王五){
* //王五业务
* return "王五业务执行";
* //
* }else if(...){
* //...
* }
* ...
*
* 使用到的设计模式如下:
* 1.工厂模式
* 2.策略设计模式
* 3.模板方法模式
*
* 情景分析:
* 进行抽取策略时,张三李四业务方法无返回值,而王五业务方法有返回值
*
* */
2.解决思想
1.使用策略模式进行将if-else中业务方法进行抽取,使用不同的Handler进行解决
2.使用工厂设计模式进行管理Handler的注册与获取
3.使用模板方法设计模式进行解决不同业务方法的实现问题
3.实现步骤
3.1定义Handler(策略模式+模板方法设计模式)
public abstract class AbstractHandler implements InitializingBean {
//子类业务是AAA还是BBB就实现哪种方法,没实现的当调用时会抛出不支持该实现异常
public void AAA(String name){
throw new UnsupportedOperationException();
}
public String BBB(String name){
throw new UnsupportedOperationException();
}
}
3.2使用Factory进行管理Handler(工厂设计模式)
public class Factory2 {
//Handler容器
private static Map<String,AbstractHandler> strategyMap = new HashMap<>();
//获取
public static AbstractHandler getInvokeHandler(String name){
return strategyMap.get(name);
}
//注册
public static void register(String name,AbstractHandler abstractHandler){
if (StringUtils.isEmpty(name) || null == abstractHandler){
return;
}
strategyMap.put(name,abstractHandler);
}
}
3.3实现每个子类Handler
张三
@Component
public class ZhangsanHandler2 extends AbstractHandler{
@Override
public void AAA(String name) {
System.out.println("张三业务执行");
}
@Override
public void afterPropertiesSet() throws Exception {
Factory2.register("张三",this);
}
}
李四
@Component
public class LisiHandler2 extends AbstractHandler{
@Override
public void AAA(String name) {
System.out.println("李四业务执行了");
}
@Override
public void afterPropertiesSet() throws Exception {
Factory2.register("李四",this);
}
}
王五
@Component
public class WangwuHandler extends AbstractHandler{
@Override
public String BBB(String name) {
return "王五业务执行了";
}
@Override
public void afterPropertiesSet() throws Exception {
Factory2.register("王五",this);
}
}
4.1测试
/**
* 工厂 + 策略 + 模板设计模式
*/
@Test
public void test(){
String name = "王五";
AbstractHandler invokeHandler = Factory2.getInvokeHandler(name);
System.out.println(invokeHandler.BBB(name));
String name2 = "李四";
Handler invokeHandler2 = Factory.getInvokeHandler(name2);
invokeHandler2.AAA(name2);
}
结果
5.优点
使用该方式进行重构对我们的部分强耦合业务进行了有效的解构,方便后期维护,如果后期有不同的模式,只需实现Handler即可
6.其他场景
当我们在设计不同支付方式业务时即可使用该方法(支付宝,微信,第三方,现金....等)