责任链模式:
使多个对象都有机会处理请求,从而避免请求地发送者和接收者之间地耦合,将这个对象连成一条链,
并沿着这条链传递该请求,直到有一个对象处理它为止。
/**
* 定义一个处理请示地接口。
* */
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);
}
}