大话设计模式之责任链模式

 责任链模式:
使多个对象都有机会处理请求,从而避免请求地发送者和接收者之间地耦合,将这个对象连成一条链,
并沿着这条链传递该请求,直到有一个对象处理它为止。

/**
 * 定义一个处理请示地接口。
 * */
abstract class Hander {

	protected Hander hander;
//设置接任者:下一个处理者
	public void setHander(Hander hander) {
		this.hander = hander;
	}
//	处理请求地抽象方法
	public abstract void HanderRequest(int re);
}
public class ConcreteHandlerA extends Hander {

	@Override
	public void HanderRequest(int re) {
		// TODO Auto-generated method stub
		// 权限在 10以内,处理此请求
		if (re >= 0 && re <= 10) {
			System.out.println("批准");
		} else if (hander != null) {
			// 转移到下一位处理
			hander.HanderRequest(re);
		}

	}
}
public class ConcreteHandlerB extends Hander {

	@Override
	public void HanderRequest(int re) {
		// TODO Auto-generated method stub
		// 权限在 10--20以内,处理此请求
		if (re >= 10 && re <= 20) {
			System.out.println("批准");
		} else if (hander != null) {
			// 转移到下一位处理
			hander.HanderRequest(re);
		}

	}
}
public class ConcreteHandlerC extends Hander {

	@Override
	public void HanderRequest(int re) {
		// TODO Auto-generated method stub
		// 权限在 20--30以内,处理此请求
		if (re >= 20 && re <= 30) {
			System.out.println("批准");
		} else if (hander != null) {
			// 转移到下一位处理
			hander.HanderRequest(re);
		}

	}
}
/**
 * 责任链的好处:
 * 当客户提交一个请时,请求是沿着链传递直至有一个具体地对象处理他
 * */
public class Test1 {
public static void main(String[] args) {
	 Hander concreteHandlerA = new ConcreteHandlerA();
	 Hander concreteHandlerB = new ConcreteHandlerB();
	 Hander concreteHandlerC = new ConcreteHandlerC();
	 concreteHandlerA.setHander(concreteHandlerB);
	 concreteHandlerB.setHander(concreteHandlerC);
	 int [] requests= {2,5,14,33,22,18,3,27,20};
	 for (int i : requests) {
		 concreteHandlerA.HanderRequest(i);	
	}
}
}

我們 根據一個具體的需求來理解責任鏈模式:
 看需求:你给项目经理提加薪,经理没有权限,只能一层一层往上提,这个需求参照责任链模式写一下

public class Request {
//申请类型
	private String requestTupe;
//	申请类容
	private String requestContext;
//	申请数量
	private int number;
	public String getRequestTupe() {
		return requestTupe;
	}
	public void setRequestTupe(String requestTupe) {
		this.requestTupe = requestTupe;
	}
	public String getRequestContext() {
		return requestContext;
	}
	public void setRequestContext(String requestContext) {
		this.requestContext = requestContext;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	
}
/**
 * 管理者
 * */
abstract class Mangger {

	protected String name;
//	管理者地上级
	protected Mangger mangger;
	
public Mangger(String string) {
		super();
		this.name = string;
	}
	//	设置管理者地上级
	public void setMangger(Mangger mangger) {
		this.mangger = mangger;
	}
//	 申请请求
	abstract public void RequestApplication(Request request);
}
public class CommonManager extends Mangger{


	public CommonManager(String string) {
		super(string);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void RequestApplication(Request request) {
		// TODO Auto-generated method stub
//		经理地权限:批准请假 3天
	if (request.getRequestTupe().equals("请假") && request.getNumber()<=3) {
		System.out.println("经理批准了");
	}	else {
		if (mangger!=null) {
			mangger.RequestApplication(request);
		}
		}
	}

}
public class Zongjian extends Mangger{


	public Zongjian(String string) {
		super(string);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void RequestApplication(Request request) {
		// TODO Auto-generated method stub
//		总监地权限:批准请假 5天
	if (request.getRequestTupe().equals("请假") && request.getNumber()<=5) {
		System.out.println("总监批准了");
	}	else {
		if (mangger!=null) {
			mangger.RequestApplication(request);
		}
	}
	}

}
public class Boss extends Mangger{


	public Boss(String string) {
		super(string);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void RequestApplication(Request request) {
		// TODO Auto-generated method stub
//		老板地权限:批准请假 ,加薪
	if (request.getRequestTupe().equals("请假") ) {
		System.out.println("老板批准了");
	}	
	else if (request.getRequestTupe().equals("加薪") && request.getNumber()<=500) {
		System.out.println("老板批准加薪");
	}
	else if (request.getRequestTupe().equals("加薪") && request.getNumber()>500) {
		System.out.println("老板不批准加薪");
	}
	}

}
/**
 * 客户端
 * */
public class Test {
public static void main(String[] args) {
	CommonManager commonManager = new CommonManager("经理");
	Zongjian zongjian = new Zongjian("总监");
	Boss boss = new Boss("老板");
//	设置上级
	commonManager.setMangger(zongjian);
	zongjian.setMangger(boss);
//	请求1:请假 2天
	Request request = new Request();
	request.setNumber(2);
	request.setRequestTupe("请假");
	request.setRequestContext("我要请假");
	commonManager.RequestApplication(request);
	
//	请求1:请假 5天
	Request request1 = new Request();
	request1.setNumber(5);
	request1.setRequestTupe("请假");
	request1.setRequestContext("我要请假");
	commonManager.RequestApplication(request1);
//	请求1:请假 15天
	Request request2 = new Request();
	request2.setNumber(15);
	request2.setRequestTupe("请假");
	request2.setRequestContext("我要请假");
	commonManager.RequestApplication(request2);
//	请求1:加薪 200天
	Request request3 = new Request();
	request3.setNumber(200);
	request3.setRequestTupe("加薪");
	request3.setRequestContext("我要加薪");
	commonManager.RequestApplication(request3);	
	
//	请求1:加薪 2000天
	Request request4 = new Request();
	request4.setNumber(2000);
	request4.setRequestTupe("加薪");
	request4.setRequestContext("我要加薪");
	commonManager.RequestApplication(request4);	
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值