职责链模式.docx
- 文档编号:12100347
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:18
- 大小:47.38KB
职责链模式.docx
《职责链模式.docx》由会员分享,可在线阅读,更多相关《职责链模式.docx(18页珍藏版)》请在冰豆网上搜索。
职责链模式
设计模式读书笔记之职责链模式(chainofresponsibility)收藏
职责链模式:
当一个请求有可能被多个对象处理,则将这些对象连成一条链,并沿着这条链传递请求,直到该请求被处理为止。
单看上图,你肯定看不出职责链模式的特征,先举一个例子来说明一下.比如一个员工想加工资,他首先会告知teamleader,如果在teamleader授权范围之内,则他可以办到,否则,就要请求上级来处理,最后直到老板,于是很容易写出这样的代码来:
viewplaincopytoclipboardprint?
publicclassEmployee{
privateTeamLeadertl;
privateDeptManagerdeptMgr;
privateGeneralManagergm;
privateBossboss;
//someotherproperties
publicvoidaddSalary(intx){
if(x<=100){
tl.addSalary(this,x);
}
elseif(x<=500){
deptMgr.addSalary(this,x);
}
elseif(x<=800){
gm.addSalary(this,x);
}
else{
boss.addSalary(this,x);
}
}
//someothermethods
}
publicclassEmployee{
privateTeamLeadertl;
privateDeptManagerdeptMgr;
privateGeneralManagergm;
privateBossboss;
//someotherproperties
publicvoidaddSalary(intx){
if(x<=100){
tl.addSalary(this,x);
}
elseif(x<=500){
deptMgr.addSalary(this,x);
}
elseif(x<=800){
gm.addSalary(this,x);
}
else{
boss.addSalary(this,x);
}
}
//someothermethods
}
这个代码中的ifelse带来了坏味道,同时,Employee必须知道他的每一个上司,并使Employee和每一个处理者(他的上司)耦合在一起.其实一个Employee一般来说只需要和他的直接上司打交道就可以了.就如下时序图所示.
把Employee的上司连成一条链,即teamleader持有他的上司部门经理,部门经理持有他的上司总经理,总经理持有他的上司老板.则Employee只需要知道teamleader即可.
加薪代码:
viewplaincopytoclipboardprint?
//
publicinterfaceSupervisor{
publicvoidaddSalary(Employeee,intadded);
}
///////////////////
publicclassEmployee{
publicStringname;
privateSupervisorsupervisor;
publicEmployee(Stringname){
this.name=name;
}
publicvoidsetSupervisor(Supervisorsupervisor){
this.supervisor=supervisor;
}
publicvoidaddSalary(intadded){
if(supervisor!
=null){
supervisor.addSalary(this,added);
}
}
}
///////////////////
publicclassTeamLeaderimplementsSupervisor{
privateSupervisorsuccessor;
publicTeamLeader(Supervisors){
this.successor=s;
}
publicvoidaddSalary(Employeee,intadded){
if(added<100){
System.out.println("TeamLeader:
"+e.name+"wanttoadd"
+added+"salary,Icanprocessit,done!
");
}
elseif(successor!
=null){
System.out.println("TeamLeader:
"+e.name+"wanttoadd"
+added+"salary,Ican'tprocessit,butmysupervisorcando!
");
successor.addSalary(e,added);
}
}
}
///////////////////
publicclassDeptManagerimplementsSupervisor{
privateSupervisorsuccessor;
publicDeptManager(Supervisors){
this.successor=s;
}
publicvoidaddSalary(Employeee,intadded){
if(added<500){
System.out.println("DeptManager:
"+e.name+"wanttoadd"
+added+"salary,Icanprocessit,done!
");
}
elseif(successor!
=null){
System.out.println("DeptManager:
"+e.name+"wanttoadd"
+added+"salary,Ican'tprocessit,butmysupervisorcando!
");
successor.addSalary(e,added);
}
}
}
///////////////////////
publicclassGeneralManagerimplementsSupervisor{
privateSupervisorsuccessor;
publicGeneralManager(Supervisors){
this.successor=s;
}
publicvoidaddSalary(Employeee,intadded){
if(added<800){
System.out.println("GeneralManager:
"+e.name+"wanttoadd"
+added+"salary,Icanprocessit,done!
");
}
elseif(successor!
=null){
System.out.println("GeneralManager:
"+e.name+"wanttoadd"
+added+"salary,Ican'tprocessit,butmysupervisorcando!
");
successor.addSalary(e,added);
}
}
}
//////////////////
publicclassBossimplementsSupervisor{
publicBoss(){}
publicvoidaddSalary(Employeee,intadded){
//boss具有最终处理权限,但是他打官腔
System.out.println("Boss:
Iwillprocessitsoon.");
}
}
/////////////////////////////
//测试用例
publicclassTest{
publicstaticvoidmain(String[]args){
Employeee=newEmployee("Jack");
Bossb=newBoss();
GeneralManagergm=newGeneralManager(b);
DeptManagerdm=newDeptManager(gm);
TeamLeadertl=newTeamLeader(dm);
e.setSupervisor(tl);
e.addSalary(1200);
}
}
/////////////////////////////
//输出
//TeamLeader:
Jackwanttoadd1200salary,Ican'tprocessit,butmysupervisorcando!
//DeptManager:
Jackwanttoadd1200salary,Ican'tprocessit,butmysupervisorcando!
//GeneralManager:
Jackwanttoadd1200salary,Ican'tprocessit,butmysupervisorcando!
//Boss:
Iwillprocessitsoon.
//
publicinterfaceSupervisor{
publicvoidaddSalary(Employeee,intadded);
}
///////////////////
publicclassEmployee{
publicStringname;
privateSupervisorsupervisor;
publicEmployee(Stringname){
this.name=name;
}
publicvoidsetSupervisor(Supervisorsupervisor){
this.supervisor=supervisor;
}
publicvoidaddSalary(intadded){
if(supervisor!
=null){
supervisor.addSalary(this,added);
}
}
}
///////////////////
publicclassTeamLeaderimplementsSupervisor{
privateSupervisorsuccessor;
publicTeamLeader(Supervisors){
this.successor=s;
}
publicvoidaddSalary(Employeee,intadded){
if(added<100){
System.out.println("TeamLeader:
"+e.name+"wanttoadd"
+added+"salary,Icanprocessit,done!
");
}
elseif(successor!
=null){
System.out.println("TeamLeader:
"+e.name+"wanttoadd"
+added+"salary,Ican'tprocessit,butmysupervisorcando!
");
successor.addSalary(e,added);
}
}
}
///////////////////
publicclassDeptManagerimplementsSupervisor{
privateSupervisorsuccessor;
publicDeptManager(Supervisors){
this.successor=s;
}
publicvoidaddSalary(Employeee,intadded){
if(added<500){
System.out.println("DeptManager:
"+e.name+"wanttoadd"
+added+"salary,Icanprocessit,done!
");
}
elseif(successor!
=null){
System.out.println("DeptManager:
"+e.name+"wanttoadd"
+added+"salary,Ican'tprocessit,butmysupervisorcando!
");
successor.addSalary(e,added);
}
}
}
///////////////////////
publicclassGeneralManagerimplementsSupervisor{
privateSupervisorsuccessor;
publicGeneralManager(Supervisors){
this.successor=s;
}
publicvoidaddSalary(Employeee,intadded){
if(added<800){
System.out.println("GeneralManager:
"+e.name+"wanttoadd"
+added+"salary,Icanprocessit,done!
");
}
elseif(successor!
=null){
System.out.println("GeneralManager:
"+e.name+"wanttoadd"
+added+"salary,Ican'tprocessit,butmysupervisorcando!
");
successor.addSalary(e,added);
}
}
}
//////////////////
publicclassBossimplementsSupervisor{
publicBoss(){}
publicvoidaddSalary(Employeee,intadded){
//boss具有最终处理权限,但是他打官腔
System.out.println("Boss:
Iwillprocessitsoon.");
}
}
/////////////////////////////
//测试用例
publicclassTest{
publicstaticvoidmain(String[]args){
Employeee=newEmployee("Jack");
Bossb=newBoss();
GeneralManagergm=newGeneralManager(b);
DeptManagerdm=newDeptManager(gm);
TeamLeadertl=newTeamLeader(dm);
e.setSupervisor(tl);
e.addSalary(1200);
}
}
/////////////////////////////
//输出
//TeamLeader:
Jackwanttoadd1200salary,Ican'tprocessit,butmysupervisorcando!
//DeptManager:
Jackwanttoadd1200salary,Ican'tprocessit,butmysupervisorcando!
//GeneralManager:
Jackwanttoadd1200salary,Ican'tprocessit,butmysupervisorcando!
//Boss:
Iwillprocessitsoon.
上面的代码有两个优点:
1Employee不再依赖于具体的上司,转而依赖于抽象,而且不必知道所有的上司;
2如果新增了处理者,只需要更改客户端代码,即重新构造责任链就可以了.
基础代码:
viewplaincopytoclipboardprint?
packagedesignpattern.chainofresponsibility;
publicabstractclassHandler{
//注意修饰符为protected,因为子类要访问他
protectedHandlersuccessor;
publicvoidsetSuccessor(Handlersuccessor){
this.successor=successor;
}
publicabstractvoidhandleRequest(intrequest);
}
//
packagedesignpattern.chainofresponsibility;
publicclassConcreteHandler1extendsHandler{
publicvoidhandleRequest(intrequest){
if(request>=0&&request<10){
System.out.println("requesthandledbyConcreteHandler1");
return;
}
if(successor!
=null){
System.out.println("ConcreteHandler1can'thandlethisrequest,dispatchtonext.");
successor.handleRequest(request);
}
}
}
//
packagedesignpattern.chainofresponsibility;
publicclassConcreteHandler2extendsHandler{
publicvoidhandleRequest(intrequest){
if(request>=10&&request<20){
System.out.println("requesthandledbyConcreteHandler2");
return;
}
if(successor!
=null){
System.out.println("ConcreteHandler2can'thandlethisrequest,dispatchtonext.");
successor.handleRequest(request);
}
}
}
//
packagedesignpattern.chainofresponsibility;
publicclassConcreteHandler3extendsHandler{
publicvoidhandleRequest(intrequest){
if(request>=20&&request<30){
System.out.println("requesthandledbyConcreteHandler3");
return;
}
if(successor!
=null){
System.out.println("ConcreteHandler3can'thandlethisrequest,dispatchtonext.");
successor.handleRequest(request);
}
}
}
//
packagedesignpattern.chainofresponsibility;
publicclassConcreteHandler4extendsHandler{
publicvoidhandleRequest(intrequest){
if(request>=30){
System.out.println("requesthandledbyConcreteHandler3");
return;
}
}
}
//客户端测试用例
packagedesignpattern.chainofresponsibility;
publicclassClient{
publicstaticvoidmain(String[]args){
Handlerhandler1=newConcreteHandler1();
Handlerhandler2=newConcreteHandler2();
Handlerhandler3=newConcreteHandler3();
Handlerhandler4=newConcreteHandler4();
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
handler3.setSuccessor(handler4);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 职责 模式