标签:
责任链(Chain of Responsibility)模式 :
责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些处理对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。责任链模式强调的是每一个对象及其对下家的引用来组成一条链,利用这种方式将发送者和接收者解耦,类图如下:
/** * 抽象处理角色 * @author mlxs * */ public abstract class Hander { /** * 处理角色 实例 */ protected Hander hander; /** * 抽象处理方法:执行处理 */ public abstract void doHander(String reqStr); public Hander getHander() { return hander; } public void setHander(Hander hander) { this.hander = hander; } }
2.添加3个具体实现子类:HanderFirst,HanderSecond,HanderLast,并实现doHander方法
/** * 具体处理角色 * @author mlxs * */ public class HanderFirst extends Hander { @Override public void doHander(String reqStr) { //得到当前处理角色 Hander nowHander = getHander(); //判断:如果是自己的责任,则处理,处理完后结束(return);否则,传给下一角色处理 if(reqStr.equals("HanderFirst")){ System.out.println("---Hander1 doHander()---"); return; }else{ //不是自己的责任,责任推给下家 System.out.println("Hander1 pass --> next"); nowHander.doHander(reqStr); } } }
/** * 具体处理角色 * @author mlxs * */ public class HanderSecond extends Hander { @Override public void doHander(String reqStr) { //得到当前处理角色 Hander nowHander = getHander(); //判断:如果是自己的责任,则处理,处理完后结束(return);否则,传给下一角色处理 if(reqStr.equals("HanderSecond")){ System.out.println("---Hander2 doHander()---"); return; }else{ //不是自己的责任,责任推给下家 System.out.println("Hander2 pass --> next"); nowHander.doHander(reqStr); } } }
/** * 具体处理角色 * @author mlxs * */ public class HanderLast extends Hander { @Override public void doHander(String reqStr) { //如果前面的都没处理,最后一家处理 System.out.println("...\n---HanderLast doHander()---"); } }
3.编写客户端请求类:Main
public class Main { public static void main(String[] args) { //创建3个具体处理者 Hander hander1 = new HanderFirst(); Hander hander2 = new HanderSecond(); Hander hander3 = new HanderLast(); //3个处理者链接,形成责任链 hander1.setHander(hander2); hander2.setHander(hander3); //从hander1开始处理请求 // hander1.doHander("HanderFirst"); // hander1.doHander("HanderSecond"); hander1.doHander("hahahahh"); } }
4.运行,查看结果
Hander1 pass --> next Hander2 pass --> next ... ---HanderLast doHander()---
过滤器和拦截器,就是通过这种模式思想写的,,,
标签:
原文地址:http://www.cnblogs.com/yzlpersonal/p/5149560.html