责任链模式

it2022-05-05  169

  在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

  以定外卖为例,我们通常要吃麦当劳只需要去麦当劳的网站去订,而网站上对应的店家可以有多个,我们不关心到底是哪家最后个给我们送过来,只需要在网站发出订单,剩下的就交给网站处理,这个时候我们就可以使用责任链模式来实现这样的场景。

  责任链模式的类图比较简单,就只有两种角色,抽象处理者和具体处理者,我们这里加上一个管理者,来维护责任链。

  订餐接口,两个方法,一个负责处理订单,一个用来设置下一个处理者。

package composibilityChain; import java.util.Map; public interface OrderHander { boolean hander(Map<String,Integer> map); void setMDL(OrderHander orderHander); }

  麦当劳店,具体的处理者

package composibilityChain; import java.util.Map; public class MDL implements OrderHander { private static int count = 1; private int number ; private Map<String,Integer> menu; private OrderHander nextMdl; public MDL( Map<String, Integer> menu) { super(); this.number = count++; this.menu = menu; } public OrderHander getNextMdl() { return nextMdl; } public void setNextMdl(OrderHander nextMdl) { this.nextMdl = nextMdl; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public Map<String, Integer> getMenu() { return menu; } public void setMenu(Map<String, Integer> menu) { this.menu = menu; } @Override public boolean hander(Map<String, Integer> map) { if(!outOfStock(menu, map)) { for (String name : map.keySet()) { menu.put(name, menu.get(name) -map.get(name)); } System.out.println("在店铺"+ number +"订餐成功"); return true; } if(nextMdl==null) { return false; } return nextMdl.hander(map); } @Override public void setMDL(OrderHander orderHander) { nextMdl = orderHander; } //判断当前店家是否有足够的食物 public static boolean outOfStock(Map<String, Integer> menu,Map<String, Integer> order){ if (order == null || order.size() == 0) { return false; } if (menu == null || menu.size() == 0) { return true; } for (String name : order.keySet()) { if (menu.get(name) - order.get(name) < 0) { return true; } } return false; } }

  麦当劳管理者,负责维护责任链,并提供接口供client调用

package composibilityChain; import java.util.Map; public class MDLManager { private static MDLManager orderManager = new MDLManager(); private MDL head; private MDL last; private MDLManager() {} public static MDLManager getMDLManager() { return orderManager; } public void registeMDLs(MDL ...mdls ) { for (MDL mdl : mdls) { registeMDL(mdl); } } public void registeMDL(MDL mdl) { if(head ==null) { head = last = mdl; }else { last.setMDL(mdl); last = mdl; } } public void handerOrder(Map<String,Integer> order) { head.hander(order); } }

  调用方

package composibilityChain; import java.util.HashMap; import java.util.Map; public class Client { public static void main(String[] args) { Map<String,Integer> menu1 = new HashMap<String,Integer>(); menu1.put("汉堡", 2); menu1.put("鸡翅", 3); menu1.put("可乐", 2); MDL mdl1 = new MDL(menu1); Map<String,Integer> menu2 = new HashMap<String,Integer>(); menu2.put("汉堡", 3); menu2.put("鸡翅", 2); menu2.put("可乐", 1); MDL mdl2 = new MDL(menu2); Map<String,Integer> menu3 = new HashMap<String,Integer>(); menu3.put("汉堡", 3); menu3.put("鸡翅", 5); menu3.put("可乐", 7); MDL mdl3 = new MDL(menu3); MDLManager.getMDLManager().registeMDLs(mdl1,mdl2,mdl3); Map<String,Integer> order = new HashMap<String,Integer>(); order.put("汉堡", 1); order.put("鸡翅", 1); order.put("可乐", 1); MDLManager.getMDLManager().handerOrder(order); } }

  以上我们便实现一个责任链模式,在javaweb开发中我们免不了会使用到filter和interceptor,其实都是责任链模式的应用,只不过在servlet容器中各个filter并不是一个链式结构,而是一个list,调用时去遍历这个list,由符合条件的filter去做处理,interceptor是spring容器负责的,具体源码我还不太清楚,有兴趣的同学可以看下interceptor是如何使用责任链模式的。

转载于:https://www.cnblogs.com/hhhshct/p/10585927.html


最新回复(0)