职责链模式.docx

上传人:b****5 文档编号:12100347 上传时间:2023-04-17 格式:DOCX 页数:18 大小:47.38KB
下载 相关 举报
职责链模式.docx_第1页
第1页 / 共18页
职责链模式.docx_第2页
第2页 / 共18页
职责链模式.docx_第3页
第3页 / 共18页
职责链模式.docx_第4页
第4页 / 共18页
职责链模式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

职责链模式.docx

《职责链模式.docx》由会员分享,可在线阅读,更多相关《职责链模式.docx(18页珍藏版)》请在冰豆网上搜索。

职责链模式.docx

职责链模式

设计模式读书笔记之职责链模式(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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1