Java职责链模式的深入了解_第1页
Java职责链模式的深入了解_第2页
Java职责链模式的深入了解_第3页
Java职责链模式的深入了解_第4页
Java职责链模式的深入了解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Java职责链模式的深入了解一、职责链模式的定义与特点

二、职责链模式的结构

三、职责链模式案例

总结

一、职责链模式的定义与特点

定义:

为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

比如我们的审批制度,低等级的审批不了的,交给上一级审批,依次类推,直到审批结束。

在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了。

特点:

1.降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。

2.增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。

3.增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。

4.责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的if或者ifelse语句。

5.责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

缺点:

1.不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。

2.对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。3.职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

二、职责链模式的结构

职责链模式的主要角色

抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

具体处理者(ConcreteHandler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。

三、职责链模式案例

案例需求:编写程序完成学习采购项目审批系统

采购员采购教学器材,如果金额小于5000,由教学主任审批,

如果金额小于10000,由院长审批

如果金额小于30000,又副校长审批

如果金额大于30000,由校长审批

采用职责链模式

那么该案例我们传统的方法大致就是采用分支语句去解决,但是这个会导致我们又违反开闭原则,就是如果我们修改审批人的话会去修改类中内容,所以我们采取职责链模式,将审批人类和处理类分开,解耦,分别去实现他。这样的话我们想要加审批人只需要添加新类即可

UML类图

请求审批类

packagecom.chainOfResponsibilityPattern.SubmitAccount;

*@authorwang

*@version1.0

*@packageNamecom.chainOfResponsibilityPattern.SubmitAccount

*@classNamePurchaseRequest

*@date2025/12/2819:31

*@Descriptio该类为请求对象,封装了请求处理的相关信息

*变量分别为请求类型,编号,价格

publicclassPurchaseRequest{

privateStringtype;

privateintid;

privatefloatprice;

publicPurchaseRequest(Stringtype,intid,floatprice){

this.type=type;

this.id=id;

this.price=price;

publicStringgetType(){

returntype;

publicintgetId(){

returnid;

publicfloatgetPrice(){

returnprice;

}

抽象处理类:

packagecom.chainOfResponsibilityPattern.SubmitAccount;

*@authorwang

*@version1.0

*@packageNamecom.chainOfResponsibilityPattern.SubmitAccount

*@classNameApprovePeople

*@date2025/12/2819:36

*@Description处理审批人的类,抽象处理请求的类

publicabstractclassApprovePeople{

*下一个审批人

ApprovePeopleapprovePeople;

*审批人名称

Stringname;

publicApprovePeople(Stringname){

=name;

*@paramapprovePeople

*@Date2025/12/2819:39

*@Param

*@Returnvoid

*@MetodNamesetNext

*@Authorwang

*@Description设置下一个审批人的对象

publicvoidsetNext(ApprovePeopleapprovePeople){

this.approvePeople=approvePeople;

*@parampurchaseRequest

*@Date2025/12/2819:40

*@Param

*@Returnvoid

*@MetodNamehandleRequest

*@Authorwang

*@Description处理请求的方法,由该类的子类根据自己的情况去实现

publicabstractvoidhandleRequest(PurchaseRequestpurchaseRequest);

}

教学主任类:

packagecom.chainOfResponsibilityPattern.SubmitAccount;

*@authorwang

*@version1.0

*@packageNamecom.chainOfResponsibilityPattern.SubmitAccount

*@classNameTeacherDirector

*@date2025/12/2819:47

*@Description教学主任类,具体的处理请求的类

publicclassTeacherDirectorextendsApprovePeople{

publicTeacherDirector(Stringname){

super(name);

@Override

publicvoidhandleRequest(PurchaseRequestpurchaseRequest){

if(purchaseRequest.getPrice()=5000){

System.out.println(请求编号为:+purchaseRequest.getId()+\n请求类型为:+purchaseRequest.getType()+

\n请求金额为:+purchaseRequest.getPrice()+的项目被++处理成功

}else{

approvePeople.handleRequest(purchaseRequest);

}

院长类

packagecom.chainOfResponsibilityPattern.SubmitAccount;/***@authorwang*@version1.0*@packageNamecom.chainOfResponsibilityPattern.SubmitAccount*@classNameDeanApprove*@date2025/12/2819:52*@Description院长处理类,具体的处理请求的类*/publicclassDeanApproveextendsApprovePeople{publicDeanApprove(Stringname){super(name);}@OverridepublicvoidhandleRequest(PurchaseRequestpurchaseRequest){if(purchaseRequest.getPrice()5000amp;amp;purchaseRequest.getPrice()=10000){System.out.println(请求编号为:+purchaseRequest.getId()+\n请求类型为:+purchaseRequest.getType()+\n请求金额为:+purchaseRequest.getPrice()+的项目被++处理成功}else{approvePeople.handleRequest(purchaseRequest);}}}

校长和副校长类类似与上,只需改动处理条件即可

客户端测试类;

packagecom.chainOfResponsibilityPattern.SubmitAccount;

*@authorwang

*@version1.0

*@packageNamecom.chainOfResponsibilityPattern.SubmitAccount

*@classNameClientTest

*@date2025/12/2819:58

*@Description客户测试类

publicclassClientTest{

publicstaticvoidmain(String[]args){

//创建一个请求

PurchaseRequestpurchaseRequest=newPurchaseRequest(体育用品,1,4000);

//创建相关审批人

TeacherDirectorzhang1=newTeacherDirector(张主任

DeanApproveli2=newDeanApprove(李院长

VicePresidentchen3=newVicePresident(陈副院长

Presidentliu4=newPresident(刘校长

*切记一定要让个处理者之间连接起来,否则会报出空指针异常,且需要构成一个环

zhang1.setNext(li2);

li2.setNext(che

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论