职责链模式(Chain of Responsibility)
:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止(我的认为并不必定非要知足这种状况,也能够是每一个对象能够处理请求的一部分,或者是下一个处理对象须要上一个处理对象首先完成一些工做,将请求沿链一步一步传递,知道请求最终处理完成,既同时兼顾请求处理和请求转发,固然这个仅仅是我的理解,可能不正确,还请谅解)。html
使用职责链模式,发起请求的客户端并不用知道是链中的哪个对象最终处理了这个请求,因此这样系统的更改能够在不影响客户端的状况下动态地从新组织和分配责任。java
职责链模式属于行为型模式。git
职责链模式的UML类图以下:github
用向银行贷款做为例子,申请的贷款金额不一样须要不一样等级的银行人员进行受权。bash
首先建立一个贷款请求,具备基本的贷款金额和贷款人信息。ide
package io.github.brightloong.design.chain;
/** * 贷款请求类 * Created by BrightLoong on 2018/5/17. */
public class LoanRequest {
/**贷款金额*/
private Long loanAmount;
/**贷款人姓名*/
private String name;
/** * 构造函数. * @param loanAmount * @param name */
public LoanRequest(Long loanAmount, String name) {
this.loanAmount = loanAmount;
this.name = name;
}
public Long getLoanAmount() {
return loanAmount;
}
public void setLoanAmount(Long loanAmount) {
this.loanAmount = loanAmount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
复制代码
package io.github.brightloong.design.chain;
/** * 请求处理抽象类. * Created by BrightLoong on 2018/5/17. */
public abstract class BankStaff {
/**持有的后继者的引用*/
private BankStaff nextBankStaff;
/**设置后继者*/
public void setNextBankStaff(BankStaff bankStaff) {
this.nextBankStaff = bankStaff;
}
/**获取后继者*/
public BankStaff getNextBankStaff() {
return this.nextBankStaff;
}
/**抽象处理方法,等待子类实现*/
public abstract void handleLoan(LoanRequest request);
}
复制代码
package io.github.brightloong.design.chain;
/** * Created by BrightLoong on 2018/5/17. */
public class BankTeller extends BankStaff {
public void handleLoan(LoanRequest request) {
if (request.getLoanAmount() <= 20000) {
System.out.println(request.getName() + "申请贷款:" + request.getLoanAmount() + "元," + "由银行柜员处理。" );
} else if (getNextBankStaff() != null) {
getNextBankStaff().handleLoan(request);
} else {
System.out.println("没法处理的贷款请求。");
}
}
}
复制代码
package io.github.brightloong.design.chain;
/** * Created by BrightLoong on 2018/5/17. */
public class BankManager extends BankStaff{
public void handleLoan(LoanRequest request) {
if (request.getLoanAmount() <= 100000) {
System.out.println(request.getName() + "申请贷款:" + request.getLoanAmount() + "元," + "由银行经理处理。" );
} else if (getNextBankStaff() != null) {
getNextBankStaff().handleLoan(request);
} else {
System.out.println("没法处理的贷款请求。");
}
}
}
复制代码
package io.github.brightloong.design.chain;
/** * Created by BrightLoong on 2018/5/17. */
public class BankPresident extends BankStaff {
public void handleLoan(LoanRequest request) {
System.out.println(request.getName() + "申请贷款:" + request.getLoanAmount() + "元," + "由银行行长处理。" );
}
}
复制代码
package io.github.brightloong.design.chain;
/** * Created by BrightLoong on 2018/5/17. */
public class Client {
public static void main(String[] args) {
//构造职责链
BankStaff bankTeller = new BankTeller();
BankStaff bankManager = new BankManager();
BankStaff bankPresident = new BankPresident();
bankTeller.setNextBankStaff(bankManager);
bankManager.setNextBankStaff(bankPresident);
//构造请求
LoanRequest request = new LoanRequest(10000L, "小明");
bankTeller.handleLoan(request);
LoanRequest request2 = new LoanRequest(200000L, "老王");
bankTeller.handleLoan(request2);
}
}
复制代码
输出结果:函数
小明申请贷款:10000元,由银行柜员处理。
老王申请贷款:200000元,由银行行长处理。
复制代码
参考:http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html性能