1 模板模式实现不同的策略(演示三种)
package com.grm.strategy.handler;
import org.springframework.beans.factory.InitializingBean;
/**
* 模板方法设计模式
*
* @author gaorimao
* @date 2022/02/22
*/
public abstract class Handler implements InitializingBean {
public void doAction1(String name) {
// 未重写时,不支持此方法(类似于AQS源码)
throw new UnsupportedOperationException();
}
public String doAction2(String name) {
// 未重写时,不支持此方法(类似于AQS源码)
throw new UnsupportedOperationException();
}
public Integer doAction3(String name) {
// 未重写时,不支持此方法(类似于AQS源码)
throw new UnsupportedOperationException();
}
}
2 工厂模式生产策略
package com.grm.strategy;
import com.grm.strategy.handler.Handler;
import org.apache.commons.lang3.ObjectUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 工厂 -> 生产策略
*
* @author gaorimao
* @date 2022/02/22
*/
public class Factory {
private static Map<String, Handler> strategyMap = new HashMap<>();
public static Handler getInvokeStrategy(String username) {
return strategyMap.get(username);
}
public static void register(String name, Handler handler) {
if (ObjectUtils.isEmpty(name) && handler == null) {
return;
}
strategyMap.put(name, handler);
}
}
3 实现不同业务逻辑(一个if就是一个业务类)
handler1
package com.grm.strategy.handler.impl;
import com.grm.strategy.Factory;
import com.grm.strategy.handler.Handler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Handler1 extends Handler {
@Override
public void doAction1(String name) {
// 业务逻辑1
log.info("doAction1----------------------------{}", name);
}
@Override
public void afterPropertiesSet() throws Exception {
Factory.register("zhangsan", this);
}
}
handler2
package com.grm.strategy.handler.impl;
import com.grm.strategy.Factory;
import com.grm.strategy.handler.Handler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Handler2 extends Handler {
@Override
public String doAction2(String name) {
// 业务逻辑2
log.info("doAction2----------------------------{}", name);
return "doAction2:" + name;
}
@Override
public void afterPropertiesSet() throws Exception {
Factory.register("wangmazi", this);
}
}
handler3
package com.grm.strategy.handler.impl;
import com.grm.strategy.Factory;
import com.grm.strategy.handler.Handler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Handler3 extends Handler {
@Override
public Integer doAction3(String name) {
// 业务逻辑3
log.info("doAction3----------------------------{}", name);
return 3;
}
@Override
public void afterPropertiesSet() throws Exception {
Factory.register("lisi", this);
}
}
写个测试类
package com.grm;
import com.grm.strategy.Factory;
import com.grm.strategy.handler.Handler;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@Slf4j
@SpringBootTest
public class AppTest
{
@Test
public void testHandler(){
String username1 = "zhangsan";
Handler handler1 = Factory.getInvokeStrategy(username1);
handler1.doAction1(username1);
String username2 = "wangmazi";
Handler handler2 = Factory.getInvokeStrategy(username2);
String string = handler2.doAction2(username2);
log.info("action2 return =================== {}",string);
String username3 = "lisi";
Handler handler3 = Factory.getInvokeStrategy(username3);
Integer integer = handler3.doAction3(username3);
log.info("action3 return =================== {}",integer);
}
}
5 测试结果