现在的位置: 首页 > 综合 > 正文

十七、责任链模式

2013年04月22日 ⁄ 综合 ⁄ 共 3519字 ⁄ 字号 评论关闭

 责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成
一条链,并沿着这条链传递该请求,直到一个对象处理它为止。 ——摘自《大话设计模式》
 
 Ps:责任处理类都有各自的负责区块,以聚合的方式连成整个的责任链条。

 基本结构如下:
 ①、Request 请求
 
 ②、Handler 处理者的超类
 Handler 自身的引用,由该属性连接链条
 HandleRequest(Request request) 处理请求的方法,该方法用于子类覆写

 ③、ConcreteHandler 具体的处理者,继承 Handler
 HandleRequest(Request request) 覆写超类的处理方法,
           内有“区块判断”,本类只处理自己该负责的部分,区块之外的请求会被传递

 示例代码:以员工要求请假、加薪,经理们进行审批为例
 ①、Request #########################################

/**
 *	请求 
 */
public class Request {
	private String type;	//请求的类型
	private String content; //请求的内容
	private int number;		//请求的数目
	
	public Request(String type, String content, int number) {
		this.type = type;
		this.content = content;
		this.number = number;
	}
	
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getContent() {
		return content;
	}
	
	public void setContent(String content) {
		this.content = content;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
}

 ②、Handler #########################################

/**
 *	管理者 
 */
public abstract class Manager {
	protected Manager manager; //设置上级
	protected String name; //管理者名称
	
	public Manager(String name){ //要求初始化实例时为名称属性赋值
		this.name = name;
	}
	
	public void setManager(Manager manager){//设置管理者
		this.manager = manager;
	}
	
	public abstract void requestApplication(Request request); //响应请求
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Manager getManager() {
		return manager;
	}
}

 ③、ConcreteHandler #########################################

/**
 *	经理,可处理3天以内的假期请求
 */
public class CommonManager extends Manager {

	public CommonManager(String name) {
		super(name);
	}

	@Override
	public void requestApplication(Request request) { //覆写请求处理方法
		if("请假".equals(request.getType()) && request.getNumber()<=3){ //3天以内的假期请求可自行处理
			System.out.println(this.name+":"+request.getContent()+
					",天数:"+request.getNumber()+"\t被批准");
		}else if(request!=null){
			this.manager.requestApplication(request); //请求在权限之外,传递请求
		}
	}
}

 

/**
 *	总监,可处理6天以内的假期请求
 */
public class MajorManager extends Manager {

	public MajorManager(String name) {
		super(name);
	}

	@Override
	public void requestApplication(Request request) {
		if("请假".equals(request.getType()) && request.getNumber()<=6){
			System.out.println(this.name+":"+request.getContent()+
					",天数:"+request.getNumber()+"\t被批准");
		}else if(request!=null){
			manager.requestApplication(request);
		}
	}
}

 

/**
 *	总经理, 可处理任意天数的假期请求和薪水调整请求
 */
public class GeneralManager extends Manager{

	public GeneralManager(String name) {
		super(name);
	}

	@Override
	public void requestApplication(Request request) {
		if("请假".equals(request.getType())){
			System.out.println(this.name+":"+request.getContent()+
					",天数:"+request.getNumber()+"\t被批准");
		}else if("加薪".equals(request.getType()) && request.getNumber()<=500){ //500及500以下的加薪请求会被批准
			System.out.println(this.name+":"+request.getContent()+
					","+request.getNumber()+"元\t被批准");
		}else if("加薪".equals(request.getType()) && request.getNumber()>500){ //500以上的加薪请求会被拒绝
			System.out.println(this.name+":"+request.getContent()+
					","+request.getNumber()+"元\t再说吧");
		}
	}
}

 测试方法:

public class Test {
	public static void main(String[] args) throws Exception {
		Manager m1 = new CommonManager("欧阳经理");
		Manager m2 = new MajorManager("司马总监");
		Manager m3 = new GeneralManager("夏侯总经理");
		//设置链条,责任次序
		m1.setManager(m2);
		m2.setManager(m3);
		
		//各种请求
		Request r1 = new Request("请假","duke要请假",2);
		Request r2 = new Request("请假","duke要请假",5);
		Request r3 = new Request("请假","duke要请假",8);
		Request r4 = new Request("加薪","duke要加薪",500);
		Request r5 = new Request("加薪","duke要加薪",1000);
		
		m1.requestApplication(r1);
		m1.requestApplication(r2);
		m1.requestApplication(r3);
		m1.requestApplication(r4);
		m1.requestApplication(r5);
	}
}

 运行结果:
 欧阳经理:duke要请假,天数:2 被批准
 司马总监:duke要请假,天数:5 被批准
 夏侯总经理:duke要请假,天数:8 被批准
 夏侯总经理:duke要加薪,500元 被批准
 夏侯总经理:duke要加薪,1000元 再说吧

抱歉!评论已关闭.