package com.test.responsibilitychain;
public class Client {
public static void main(String[] args) {
//创建一个请求
PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000, 1);
//创建相关的审批人
DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
CollegeApprover collegeApprover = new CollegeApprover("李院长");
ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校");
SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("佟校长");
//需要将各个审批级别的下一个设置好 (处理人构成环形)
departmentApprover.setApprover(collegeApprover);
collegeApprover.setApprover(viceSchoolMasterApprover);
viceSchoolMasterApprover.setApprover(schoolMasterApprover);
//防止一千块钱也来找校长处理,找校长的话,校长就去找手下处理
schoolMasterApprover.setApprover(departmentApprover);
//找谁开始调用都可以实现功能
departmentApprover.processRequest(purchaseRequest);
viceSchoolMasterApprover.processRequest(purchaseRequest);
}
}
【主类】
SQL复制代码
请求编号 id= 1 被 佟校长 处理
请求编号 id= 1 被 佟校长 处理
Process finished with exit code 0
案例二
类图
实现
【问题类】
java复制代码
package com.test.responsibilitychain.Sample;
public class Trouble {
/**
* 问题编号
*/
private int number;
/**
* 根据编号生成问题
* @param number
*/
public Trouble(int number) {
this.number = number;
}
/**
* 获取问题编号
* @return
*/
public int getNumber() {
return number;
}
/**
* 代表问题的字符串
* @return
*/
public String toString() {
return "[Trouble " + number + "]";
}
}
【用来解决问题的抽象类】
java复制代码
package com.test.responsibilitychain.Sample;
public abstract class Support {
/**
* 解决问题的实例的名字
*/
private String name;
/**
* 要推卸给的对象
*/
private Support next;
/**
* 生成解决问题的实例
*
* @param name
*/
public Support(String name) {
this.name = name;
}
/**
* 设置要推卸给的对象
*
* @param next
* @return
*/
public Support setNext(Support next) {
this.next = next;
return next;
}
/**
* 解决问题的步骤
* 调用了抽象方法resolve,这里属于模板方法模式
* @param trouble
*/
public void support(Trouble trouble) {
if (resolve(trouble)) {
done(trouble);
} else if (next != null) {
// 问题还没有解决,让下一个对象来尝试解决
next.support(trouble);
} else {
// 所有对象都没有办法解决该问题,提示用户 问题没办法解决
fail(trouble);
}
}
/**
* 显示字符串
*
* @return
*/
public String toString() {
return "[" + name + "]";
}
/**
* 解决问题的方法
* 需要子类去具体实现,如果解决了问题,就返回true
*
* @param trouble
* @return
*/
protected abstract boolean resolve(Trouble trouble);
/**
* 解决
*
* @param trouble
*/
protected void done(Trouble trouble) {
System.out.println(trouble + " is resolved by " + this + ".");
}
/**
* 未解决
*
* @param trouble
*/
protected void fail(Trouble trouble) {
System.out.println(trouble + " cannot be resolved.");
}
}
【不解决问题的类】
java复制代码
package com.test.responsibilitychain.Sample;
public class NoSupport extends Support {
public NoSupport(String name) {
super(name);
}
/**
* 解决问题的方法
* 什么都解决不了,直接返回false
* @param trouble
* @return
*/
protected boolean resolve(Trouble trouble) {
return false;
}
}
【具体解决问题的类:只要问题的编号小于limit,就可以解决】
java复制代码
package com.test.responsibilitychain.Sample;
/**
* 可以解决编号小于limit的问题
*/
public class LimitSupport extends Support {
private int limit;
/**
* 构造函数
*
* @param name
* @param limit
*/
public LimitSupport(String name, int limit) {
super(name);
this.limit = limit;
}
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() < limit) {
/*
解决了什么什么问题
*/
return true;
} else {
return false;
}
}
}
【具体解决问题的类:只要问题的编号是奇数,就可以解决】
java复制代码
package com.test.responsibilitychain.Sample;
public class OddSupport extends Support {
/**
* 构造函数
* @param name
*/
public OddSupport(String name) {
super(name);
}
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() % 2 == 1) {
return true;
} else {
return false;
}
}
}
【具体解决问题的类:只能解决指定编号的问题】
java复制代码
package com.test.responsibilitychain.Sample;
public class SpecialSupport extends Support {
private int number;
/**
* 构造函数
*
* @param name
* @param number
*/
public SpecialSupport(String name, int number) {
super(name);
this.number = number;
}
/**
* 解决问题的方法
*
* @param trouble
* @return
*/
protected boolean resolve(Trouble trouble) {
if (trouble.getNumber() == number) {
return true;
} else {
return false;
}
}
}
【主类】
java复制代码
package com.test.responsibilitychain.Sample;
public class Main {
public static void main(String[] args) {
// 生成六个解决问题的实例
Support alice = new NoSupport("Alice");
Support bob = new LimitSupport("Bob", 100);
Support charlie = new SpecialSupport("Charlie", 429);
Support diana = new LimitSupport("Diana", 200);
Support elmo = new OddSupport("Elmo");
Support fred = new LimitSupport("Fred", 300);
// 连接对象,形成职责链
alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);
// 制造各种问题,增长步长大一点,让问题的编号更加的分散
for (int i = 0; i < 500; i += 33) {
alice.support(new Trouble(i));
}
}
}
【运行】
java复制代码
[Trouble 0] is resolved by [Bob].
[Trouble 33] is resolved by [Bob].
[Trouble 66] is resolved by [Bob].
[Trouble 99] is resolved by [Bob].
[Trouble 132] is resolved by [Diana].
[Trouble 165] is resolved by [Diana].
[Trouble 198] is resolved by [Diana].
[Trouble 231] is resolved by [Elmo].
[Trouble 264] is resolved by [Fred].
[Trouble 297] is resolved by [Elmo].
[Trouble 330] cannot be resolved.
[Trouble 363] is resolved by [Elmo].
[Trouble 396] cannot be resolved.
[Trouble 429] is resolved by [Charlie].
[Trouble 462] cannot be resolved.
[Trouble 495] is resolved by [Elmo].
Process finished with exit code 0