转眼间,跳槽到新公司也有一年多了,这期间基本上把公司的产品都大致的看了一遍,有时候看到好的设计和思路却没有仔细体会和总结,俗话说得好: 好记性不如烂笔头啊。既然是写给自己的,那就想到什么就写什么吧。
一. 系统间融合与通信。
1. jms配合activemq (细节描述待补充)
大致做法如下:
2. EventPublish
(待补充)
二. 设计模式
1. 状态模式
一个大型的产品往往是业界某类问题的通用解决方案,为了增强产品的适用性,必须考虑方方面面的可能因素以及对功能后续的延展,因此一般顶层接口的复用性很高。比如工作流系统当中可能会涉及到"管理工单"、"事件工单"等许多类型的工单处理,为了加快后端对页面的响应速度和对不同工单根据紧急程度进行编排,我们往往会将待处理的工单放入队列中等待处理,此时问题就来了,处理队列中的工单肯定是一个通用的方法,该如何根据工单类型的不同调用不同的方法呢?难道写一大堆的if else吗? 那后期扩展更多的工单类型怎么办,难不成继续else下去?所以想到了使用状态模式来处理。
现在是2019年,大部分的公司已经用上了jdk1.8,支持协变返回类型(允许子类中覆盖父类的方法的返回类型是父类原始方法返回类型的子类),所以才能使用下述写法。如果项目使用的是jdk1.5以下(不包括jdk1.5),则没办法使用。
import java.util.HashMap;
import java.util.Map;
public class TicketServiceImpl {
public static void main(String[] args) {
TicketCenter ticketCenter = new TicketCenter();
ticketCenter.handler();
System.out.println("======");
ticketCenter.changeHandler("管理工单");
ticketCenter.handler();
}
}
class TicketCenter {
private TicketHandler ticketHandler = new TicketEventHandler();
//ticketHandlerMap的值可以来自普通的rdbms,也可以来自noSql如redis
private Map<String, String> ticketHandlerMap = new HashMap<String, String>(){{
put("事件工单", "com.mmr.TicketEventHandler");
put("管理工单", "com.mmr.TicketManagerHandler");
put("变更工单", "com.mmr.TicketChangeHandler");
}};
public void changeHandler(String name){
try {
ticketHandler = (TicketHandler)Class.forName(ticketHandlerMap.get(name)).newInstance();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
}
public void handler(){ ticketHandler.handlerTicket();}
}
class TicketHandler{
public void handlerTicket(){}
}
class TicketEventHandler extends TicketHandler{
public void handlerTicket(){
System.out.println("处理事件工单...");
}
}
class TicketManagerHandler extends TicketHandler{
public void handlerTicket(){
System.out.println("处理管理工单...");
}
}
class TicketChangeHandler extends TicketHandler{
public void handlerTicket(){
System.out.println("处理变更工单...");
}
}