行为型模式关注对象之间交互,对象之间的通信与协作。共十一个,职责链模式是其中之一。
为什么职责链模式属于行为型模式,因为他很好的体现了对象之间的通信与协作,职责链,就是说在这条链上的对象都有这个职责,有职责来做什么呢?处理请求。
举个例子,公司审批活动经费,小于5000,副经理就有权限审批,5000-10000,需要经理审批,10000-50000董事长审批,大于50000,召开董事会决定。
在这种情况下,如果不使用职责连模式会怎么写呢,在客户端进行金额范围判断,然后new对象处理请求。这样写下来客户端和各请求处理者(经理,董事长等)耦合性太强了,扩展性自然就很差。如果使用职责链模式呢?看下面示例:
职责链模式UML类图:
示例代码:
抽象处理者:
/****
* 抽象处理者(经理、董事长等处理者父类)
* @author wjw
*
*/
public abstract class Handler {
//处理链,当然是一条链,所以它要维护这一个链的下一个处理者的引用,如果自己处理不了,传给
//链的下一个处理者,这样请求总会被处理,才能形成一个完整的处理链
protected Handler handler;
public void setHandler(Handler handler){
this.handler = handler;
}
public abstract void handleRequest(int amount);
}
副经理处理者:
/****
* 副经理类,有处理5000以下金额权限
* @author wjw
*
*/
public class DeputyGeneralManager extends Handler{
@Override
public void handleRequest(int amount) {
// TODO Auto-generated method stub
if(amount <= 5000 && amount > 0){
System.out.println("我是副经理我最屌,让我来处理了这个不到5000申请吧!");
}else{
handler.handleRequest(amount);
}
}
}
经理处理者:
/****
* 经理类(处理5000-10000)
* @author wjw
*
*/
public class GeneralManager extends Handler{
@Override
public void handleRequest(int amount) {
// TODO Auto-generated method stub
if(amount <= 10000 && amount > 5000){
System.out.println("我是经理比副经理屌,让我来处理了这个5000-10000申请吧!");
}else{
handler.handleRequest(amount);
}
}
}
/****
* 董事长(处理10000-50000)
* @author wjw
*
*/
public class Chairman extends Handler{
@Override
public void handleRequest(int amount) {
// TODO Auto-generated method stub
if(amount <= 50000 && amount > 10000){
System.out.println("我是董事长比经理屌,让我来处理了这个10000-50000申请吧!");
}else{
handler.handleRequest(amount);
}
}
}
董事会处理者:
/****
* 董事会(处理50000以上金额)
* @author wjw
*
*/
public class BoardOfDirectors extends Handler{
@Override
public void handleRequest(int amount) {
// TODO Auto-generated method stub
if(amount > 50000){
System.out.println("你们都没我屌,让我来处理了这个大于50000申请吧!");
}else{
System.out.println("提交请求金额出错!");
}
}
}
Main:
public class Main {
public static void main(String[] args) {
Handler deputyGm, gm, chairman, bod;
deputyGm = new DeputyGeneralManager();//副经理
gm = new GeneralManager();//经理
chairman = new Chairman();//董事长
bod = new BoardOfDirectors();
//构建职责职责链:副经理--经理--董事长--董事会
deputyGm.setHandler(gm);
gm.setHandler(chairman);
chairman.setHandler(bod);
//向职责链提交请求
deputyGm.handleRequest(80000);
}
}
运行结果:
你们都没我屌,让我来处理了这个大于50000申请吧!
职责链模式说明:以上例子很简单,主要理解职责链这个模式,职责链需要构建一个请求处理的链,这个链的修改和扩展也很容易,不必修改源代码,直接扩展处理者即可。我们有请求,直接将请求发送给职责链的一头,他自己就会按照我们的链执行下去。
就好像例子中的,我们将80000的活动经费申请报告提交给副经理,副经理一看,呀,我级别太低,不够权限批这麽多的经费,交给经理吧,经理一看,我也不行啊,给董事长吧,董事长一看,这太多了,公司是大家的,花这么多钱得大家研究研究,提交到董事会决定吧。于是走了一遍职责链。
如有错误,欢迎指正
end