在策略模式+工厂模式中,没有使用到模板模式,因为张三和李四的业务逻辑都是调用AAA方法,如果现在在增加一个方法,次方法只需要李四一人去实现BBB方法,此时张三的handel中就会报错,需要张三也去实现BBB方法,这时就出现了模板模式,即将接口变为抽象类,实现自己的方法即可.
优化前后:
@Test
String noDesign2() {
String name = "张三";
if (name.equals("张三")) {
// 业务逻辑A
return "张三完成任务AAA";
} else if (name.equals("李四")) {
// 业务逻辑B
return "李四完成任务BBB";
}
return "end";
}
// 工厂 + 策略 + 模板设计模式
@Test
void design2() {
String name = "张三";
AbstractHandler strategy = Factory2.getInvokeStrategy(name);
strategy.AAA(name);
//strategy.BBB(name);
}AbstractHandler:
import org.springframework.beans.factory.InitializingBean;
/**
* 模板方法设计模式
*/
public abstract class AbstractHandler implements InitializingBean {
public void AAA(String name) {
throw new UnsupportedOperationException();
}
public String BBB(String name) {
throw new UnsupportedOperationException();
}
}Factory2:
import com.google.common.collect.Maps;
import org.springframework.util.StringUtils;
import java.util.Map;
/**
* 工厂设计模式
*/
public class Factory2 {
private static Map<String, AbstractHandler> strategyMap = Maps.newHashMap();
public static AbstractHandler getInvokeStrategy(String str) {
return strategyMap.get(str);
}
public static void register(String str, AbstractHandler handler) {
if (StringUtils.isEmpty(str) || null == handler) {
return;
}
strategyMap.put(str, handler);
}
}ZhangSanHandler2:
import org.springframework.stereotype.Component;
@Component
public class ZhangSanHandler2 extends AbstractHandler {
@Override
public String AAA(String name) {
// 业务逻辑B
return "张三完成任务B";
}
@Override
public void afterPropertiesSet() throws Exception {
Factory2.register("张三", this);
}
}
LiSiHandler2:
import org.springframework.stereotype.Component;
@Component
public class LiSiHandler2 extends AbstractHandler {
@Override
public String BBB(String name) {
// 业务逻辑B
return "李四完成任务B";
}
@Override
public void afterPropertiesSet() throws Exception {
Factory2.register("李四", this);
}
}
版权声明:本文为u013008898原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。