前言
上一篇中介绍了采用表驱动(map)方式和Optional方式取代if...else、switch...case逻辑。本章采用JAVA设计模式之策略模式抽象公共方法,剥离像map这样的紧耦合操作,对扩展开放,只关心自己的handler逻辑即可。
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
策略模式UML结构图:
我们还是继续上一篇的业务处理,采用策略模式处理消息。首先新建一个AbstractHandler接口:
public interface AbstractHandler {
public void messageHandle();
}
然后新建三个具体的实现handler,分别是ModNewHandler、ModUpdateHandler、ModDeleteHandler,代码如下:
import org.springframework.stereotype.Component;
@Component
public class ModNewHandler implements AbstractHandler {
@Override
public void messageHandle() {
System.out.println("mode new handler...");
}
}
import org.springframework.stereotype.Component;
@Component
public class ModUpdateHandler implements AbstractHandler {
@Override
public void messageHandle() {
System.out.println("mode update handler...");
}
}
import org.springframework.stereotype.Component;
@Component
public class ModDeleteHandler implements AbstractHandler {
@Override
public void messageHandle() {
System.out.println("mode delete handler...");
}
}
实现HandlerContext类,如下代码:
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
@Component
public class HandlerContext {
private static Map<Integer, AbstractHandler> map = new HashMap<>();
static {
map.put(0, new ModNewHandler());
map.put(1, new ModUpdateHandler());
map.put(2, new ModDeleteHandler());
}
public AbstractHandler getHandler(Integer type) {
return map.get(type);
}
}
具体的实现类如下:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tv.mgt.msg.MsgInfo;
public class ModMessageApplication {
public static void main(String[] args) {
MsgInfo msgVo = new MsgInfo();
msgVo.setType(0);
Integer type = msgVo.getType();
ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"classpath*:spring/context.xml"});
HandlerContext handlerContext = ac.getBean(HandlerContext.class);
AbstractHandler handler = handlerContext.getHandler(type);
handler.messageHandle();
}
}
执行后的结果如下:
mode new handler...
本章通过策略模式替换了if...else、switch...case,其实策略模式应用在很多地方,后续有可能还会介绍。