文章是读写 http://blog.csdn.net/lovelion 博客后写的。基本都是他的思想。尽力按照记忆写出来的。
package ListModel;
class PurchaseRequest {
private double amount; // 采购金额
private int number; // 采购单编号
private String purpose; // 采购目的
public PurchaseRequest(double amount, int number, String purpose) {
this.amount = amount;
this.number = number;
this.purpose = purpose;
}
public void setAmount(double amount) {
this.amount = amount;
}
public double getAmount() {
return this.amount;
}
public void setNumber(int number) {
this.number = number;
}
public int getNumber() {
return this.number;
}
public void setPurpose(String purpose) {
this.purpose = purpose;
}
public String getPurpose() {
return this.purpose;
}
}
//
abstract class Approver{
protected Approver successor;
protected String name;
public Approver(String name) {
this.name = name;
}
public void setApprover(Approver s){
this.successor = s;
}
public abstract void processing(PurchaseRequest request);
}
class Director extends Approver{
public Director(String name){
super(name);
}
public void processing(PurchaseRequest request){
if(request.getAmount()<5000){
System.out.println("主任批准 "+this.name+request.getAmount()+":::"+request.getNumber()
+":::"+request.getPurpose());
}else{
this.successor.processing(request);
}
}
}
class vicePresident extends Approver{
public vicePresident(String name){
super(name);
}
public void processing(PurchaseRequest request){
if(request.getAmount()<15000){
System.out.println("副经理 "+this.name+request.getAmount()+":::"+request.getNumber()
+":::"+request.getPurpose());
}else{
this.successor.processing(request);
}
}
}
class President extends Approver{
public President(String name){
super(name);
}
public void processing(PurchaseRequest request){
if(request.getAmount()<115000){
System.out.println("经理 "+this.name+request.getAmount()+":::"+request.getNumber()
+":::"+request.getPurpose());
}else{
this.successor.processing(request);
}
}
}
class Congress extends Approver{
public Congress(String name){
super(name);
}
public void processing(PurchaseRequest request){
if(request.getAmount()>=115000){
System.out.println("董事会 "+this.name+request.getAmount()+":::"+request.getNumber()
+":::"+request.getPurpose());
}else{
this.successor.processing(request);
}
}
}
public class ListMoedel{
public static void main(String[] args) {
Approver zhansan,lisi,wangwu,zhaoliu;
zhansan = new Director("zhansan");
lisi = new vicePresident("lisi");
wangwu = new President("wangwu");
zhaoliu = new Congress("zhaoliu");
zhansan.setApprover(wangwu);
//lisi.setApprover(wangwu);
wangwu.setApprover(zhaoliu);
PurchaseRequest a = new PurchaseRequest(2000, 2, "dao");
PurchaseRequest b = new PurchaseRequest(12000, 2, "jiao");
PurchaseRequest c = new PurchaseRequest(20000, 2, "jiao");
PurchaseRequest d = new PurchaseRequest(2000000, 2, "qiao");
zhansan.processing(a);
zhansan.processing(b);
zhansan.processing(c);
zhansan.processing(d);
}
}
输出结果为:
主任批准 zhansan2000.0:::2:::dao
经理 wangwu12000.0:::2:::jiao
经理 wangwu20000.0:::2:::jiao
董事会 zhaoliu2000000.0:::2:::qiao
1.主要优点
职责链模式的主要优点如下:
(1) 职责链模式使得一个对象无须知道是其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度。
(2) 请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接。
(3) 在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。
(4) 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。
2.主要缺点
职责链模式的主要缺点如下:
(1) 由于一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理。
(2) 对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。
(3) 如果建链不当,可能会造成循环调用,将导致系统陷入死循环。
3.适用场景
在以下情况下可以考虑使用职责链模式:
(1) 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。
(2) 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
(3) 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。