原有业务 同一种业务 抽象出多个业务方法,不同业务类 所需要实现的业务方法不一样
@Test
void test2() {
String name = "李四";
if (name.equals("张三")){
System.out.println(name+"业务1");
String work2 = name+"业务2";
}else if (name.equals("李四")){
System.out.println(name+"业务5");
System.out.println(name+"业务6");
System.out.println(name+"业务7");
}
}
工厂类设计
public class Factory2 {
public static Map<String, TemplateModel> map = new HashMap<>();
/**
* 将 业务方法注册进工厂 中
* @param name
* @param handler
*/
public static void register(String name,TemplateModel handler){
map.put(name,handler);
}
/**
* 直接从 工厂map中获取业务类
* @param name
* @return
*/
public static TemplateModel getInvoke(String name){
return map.get(name);
}
}
模板方法类设计,相较于策略模式,模板方法区别在于它自身为抽象类,这样他就可以有默认实现,而业务类只需要实现自己需要的业务方法
/**
* 相比于 策略模式 模板方法 模式 可以选择实现需要抽象的方法
* 因为设计为抽象类 有默认的实现方法 继承了这个抽象类的业务类
* 只需实现自身需要实现的业务,不需要的业务交给抽象类的默认方法
* 如果实现了业务类中不需要的方法 根据 对象的多态性 则会调用 模板类中的 默认实现方法 抛出异常
*/
public abstract class TemplateModel implements InitializingBean {
public void pay(String name){
throw new UnsupportedOperationException();
}
public String callBack(){
throw new UnsupportedOperationException();
}
}
两个业务类
@Component
public class LiSiHandler extends TemplateModel{
private static String name = "李四";
@Override
public String callBack() {
return name+"业务2";
}
@Override
public void afterPropertiesSet() throws Exception {
Factory2.register(name,this);
}
}
-----------------------------------------------------------------------------
@Component
public class ZhangSanHandler2 extends TemplateModel{
private static String name = "张三";
@Override
public void pay(String name) {
System.out.println(name+"完成业务1");
System.out.println(name+"完成业务2");
System.out.println(name+"完成业务3");
}
@Override
public void afterPropertiesSet() throws Exception {
Factory2.register(name,this);
}
}