package responsibilityChainModel;

/*
 * 加薪  请假
 */
public class Commonly {
		public static void main(String[] args) {
			
			//职位
			Manager jingli = new Manager("经理");
			Manager zongjian = new Manager("总监");
			Manager zongjingli = new Manager("总经理");
			//请求  加薪
			 Request request = new Request();
			 request.setRequestType("加薪");
			 request.setRequestContent("小明请求加薪");
			 request.setNumber(1000);
			 //处理加薪请求
			 jingli.GetResult("经理", request);
			 zongjian.GetResult("总监", request);
			 zongjingli.GetResult("总经理", request);
			 
			//请求  请假
			 Request request2 = new Request();
			 request2.setRequestType("请假");
			 request2.setRequestContent("小红请假");
			 request2.setNumber(3);
			 //处理请假请求
			 jingli.GetResult("经理", request2);
			 zongjian.GetResult("总监", request2);
			 zongjingli.GetResult("总经理", request2);
			 
			 //GetResult方法太长了 负责好几个职位的处理 违背了单一职责原则 
			  //如果加一个副总处理了就需要修改这个方法 违背了开放-封闭原则
			 //而且这里  总监已经处理了请假3天 总经理是不需要再进行处理的
		}
}

//申请 (加薪 请假)
class Request{
	//申请类别
	private String requestType;
	//申请内容
	private String requestContent;
	//数量
	private int number;
	public String getRequestType() {
		return requestType;
	}
	public void setRequestType(String requestType) {
		this.requestType = requestType;
	}
	public String getRequestContent() {
		return requestContent;
	}
	public void setRequestContent(String requestContent) {
		this.requestContent = requestContent;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
}

//管理者 
class Manager{
	protected String name;
	public Manager(String name){
		this.name = name;
	}
	public void GetResult(String level , Request request){
		if("经理".equals(level)){
			if("请假".equals(request.getRequestType())&&request.getNumber() <=2 ){
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
			}else{
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"我无权处理了!");
			}
		}
		else if("总监".equals(level)){
			if("请假".equals(request.getRequestType())&&request.getNumber() <=5 ){
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
			}else{
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"我无权处理了!");
			}
		}
		else if("总经理".equals(level)){
			if("请假".equals(request.getRequestType()) ){
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
			}else if("加薪".equals(request.getRequestType()) && request.getNumber() <=500){
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
			}else if("加薪".equals(request.getRequestType()) && request.getNumber() >500){
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"再说吧");
			}
		}
		
	}
}



package responsibilityChainModel;

/*
 * 责任链模式:
 * 使多个对象都有机会处理请求 从而避免请求的发送者和接受者之间的耦合关系。
 * 将这一对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
 * 
 * 适用性:
 * • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
   • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
   •可动态指定一组对象处理请求。
 * 不足:
 * 1) • 不能保证请求一定被接收。既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 —该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。
 * 2) • 系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。
 * 纯与不纯的职责链模式:
 * 纯的职责链模式:一个具体处理者角色处理只能对请求作出两种行为中的一个:
 * 一个是自己处理(承担责任),另一个是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。
 * 请求在责任链中必须被处理,不能出现无果而终的结局。
 * 反之就是不纯的职责链模式,在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;
 * 在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收。
 */
public class ResponsibilityChainModel {
	public static void main(String[] args) {
		//职位
		ManagerR jingli = new jingli("经理");
		ManagerR zongjian = new zongjian("总监");
		ManagerR zongjingli = new zongjingli("总经理");
		//设置上级责任链对象
		jingli.setSuperM(zongjian);
		zongjian.setSuperM(zongjingli);
		
		//请求  加薪
		 RequestR request = new RequestR();
		 request.setRequestType("加薪");
		 request.setRequestContent("小明请求加薪");
		 request.setNumber(1000);
	
		//处理
		 jingli.RequestApplications(request);
		
		 //请求  请假
		 RequestR request2 = new RequestR();
		 request2.setRequestType("请假");
		 request2.setRequestContent("小红请假");
		 request2.setNumber(3);
		 
		 jingli.RequestApplications(request2);
		 
		 
		 //这里的结果就很明了  最后到了总经理 加薪没有解决 
		 //请假只到了总监这一层 就结束了 没有再打扰总经理

	}
}


/*
 * 申请 (加薪 请假)
 */
class RequestR{
	//申请类别
	private String requestType;
	//申请内容
	private String requestContent;
	//数量
	private int number;
	public String getRequestType() {
		return requestType;
	}
	public void setRequestType(String requestType) {
		this.requestType = requestType;
	}
	public String getRequestContent() {
		return requestContent;
	}
	public void setRequestContent(String requestContent) {
		this.requestContent = requestContent;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
}
/*
 * 管理者抽象类
 */
abstract class ManagerR{
	protected String name;
	//管理者上级
	protected ManagerR superM;
	//带参构造方法
	public ManagerR(String name){
		this.name = name;
	}
	//设置上级管理
	public void setSuperM(ManagerR superM) {
		this.superM = superM;
	}
	//申请请求
	abstract public void RequestApplications(RequestR requestR);
}

/*
 * 经理
 */
class jingli extends ManagerR{
	//构造方法
	public jingli(String name) {
		super(name);
	}
	//
	public void RequestApplications(RequestR request) {
			if("请假".equals(request.getRequestType())&&request.getNumber() <=2 ){
				System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
			}else{
				if(superM != null){
					superM.RequestApplications(request);
				}	
		}
	}
}

/*
 * 总监
 */
class zongjian extends ManagerR{
	//构造方法
	public zongjian(String name) {
		super(name);
	}
	public void RequestApplications(RequestR request) {
		if("请假".equals(request.getRequestType())&&request.getNumber() <=5 ){
			System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
		}else{
			if(superM != null){
				superM.RequestApplications(request);
			}
		}
	}
}


/*
 * 总经理
 */
class zongjingli extends ManagerR{
	//构造方法
	public zongjingli(String name) {
		super(name);
	}
	public void RequestApplications(RequestR request) {
		if("请假".equals(request.getRequestType()) ){
			System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
		}else if("加薪".equals(request.getRequestType()) && request.getNumber() <=500){
			System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"被处理");
		}else if("加薪".equals(request.getRequestType()) && request.getNumber() >500){
			System.out.println(name+":"+request.getRequestContent() +",数量 "+request.getNumber()+"再说吧");
		}
	}
}