JAVA设计模式-Chain of Responsibility

 职责链模式顾名思义是一个链条,在这个链条上的所有节点都可以处理请求,但是在某一种情况下,哪一个节点来处理这个请求是运行时决定的,但是客户端不需要知道具体是谁来处理,他只需要将请求交给一个节点就行了,当这个节点可以处理时,它就处理并返回给客户端,当它不能处理时,将这个请求传给职责链上的下一个节点,依次下去,直到请求被处理或者达到链条的最后一个节点。

 

    例如,当我向我的上级经理要提出请半天假的时候,这种事情他批准就行了,它可以直接给我回复;当我要请一个星期假的时候,他就没权力批准了,因此他向他的经理转交这个请求,他的经理同意之后给我回复;如果我提出要加薪的时候,我的经理和我的经理的经理也搞不定,他只有再向上一层回报,也就是总经理,总经理拿到这个请求之后会判断同意或者不同意,然后给我回复。这就是职责链,下面的代码就是模拟这个情况。

package chainOfResponsebility;

class Request {   

	private String name;   
	private String requestType;   
	private int number; 

	public String getName() {   
		return name;   
	}   
	public void setName(String name) {   
		this.name = name;   
	}   
	public String getRequestType() {   
		return requestType;   
	}   
	public void setRequestType(String requestType) {   
		this.requestType = requestType;   
	}   
	public int getNumber() {   
		return number;   
	}   
	public void setNumber(int number) {   
		this.number = number;   
	} 
}   

abstract class Manager {

	protected String name;
	//管理者的上级
	protected Manager superior;

	public Manager(String name) {
		this.name=name;
	}
	//设置管理者的上级
	public void SetSuperior(Manager superior){
		this.superior=superior;
	}
	//声请请求
	abstract public void requestApplications(Request requset);
} 

//总经理   
class GeneralManager extends Manager {   

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

	@Override  
	public void requestApplications(Request request) {  
		if(request.getRequestType().equals("请假")&&request.getNumber()<=7){
			System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",GeneralManager,"+this.name);   
		}else if(request.getRequestType().equals("加薪")&&request.getNumber()<=800){   
			System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",GeneralManager,"+this.name);   
		}   
		else{   
			System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"不批准"+",GeneralManager,"+this.name); 
		}  
	}   
}   

//总监   
class Majordomo extends Manager {   
	public Majordomo(String name) {   
		super(name);   
	}   

	@Override  
	public void requestApplications(Request request) {   
		if(request.getRequestType().equals("请假")&&request.getNumber() <=5){   
			System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",Majordomo,"+this.name);   
		}else{   
			if(this.superior!=null){   
				this.superior.requestApplications(request);   
			}   
		}   
	}   
}   



//经理   
class CommonManager extends Manager {   
	public CommonManager(String name) {   
		super(name);   
	}   

	@Override  
	public void requestApplications(Request request) {   
		if(request.getRequestType().equals("请假")&& request.getNumber()<=2){   
			System.out.println(request.getName()+request.getRequestType()+request.getNumber()+"被批准"+",CommonManager,"+this.name);   
		}else{   
			if(this.superior!=null){   
				this.superior.requestApplications(request);   
			}   
		}   
	}   
}  

public class Test{
	public static void main(String[]args){

		CommonManager commonManager =new CommonManager("Tom");
		Majordomo majordomo =new Majordomo("Jerry");
		GeneralManager generalManager =new GeneralManager("Thomas");
		
		//设置上下级
		commonManager.SetSuperior(majordomo);
		majordomo.SetSuperior(generalManager);

		Request request = new  Request();
		request.setName("Vincent");
		request.setRequestType("请假");
		request.setNumber(1);
		commonManager.requestApplications(request);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值