千家信息网

如何理解Java设计模式的职责链模式

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,本篇内容介绍了"如何理解Java设计模式的职责链模式"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一
千家信息网最后更新 2025年01月16日如何理解Java设计模式的职责链模式

本篇内容介绍了"如何理解Java设计模式的职责链模式"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、什么是职责链模式

客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链。使编程更有灵活性。

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。其过程实际上是一个递归调用。

要点主要是:

1、有多个对象共同对一个任务进行处理。

2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。

3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。

4、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。

二、职责链模式的结构

责任链模式涉及到的角色如下所示:

  • 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

  • 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家三、职责链模式的优缺点

优点:

职责链模式的最主要功能就是:动态组合,请求者和接受者解耦。

请求者和接受者松散耦合:请求者不需要知道接受者,也不需要知道如何处理。每个职责对象只负责自己的职责范围,其他的交给后继者。各个组件间完全解耦。

动态组合职责:职责链模式会把功能分散到单独的职责对象中,然后在使用时动态的组合形成链,从而可以灵活的分配职责对象,也可以灵活的添加改变对象职责。

缺点:

产生很多细粒度的对象:因为功能处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完,需要很多的职责对象,会产生大量的细粒度职责对象。

不一定能处理:每个职责对象都只负责自己的部分,这样就可以出现某个请求,即使把整个链走完,都没有职责对象处理它。这就需要提供默认处理,并且注意构造链的有效性。

四、职责链模式的使用场景

1.如果有多个对象可以处理同一个请求,但是具体由哪个对象处理是由运行时刻动态决定的,这种对象就可以使用职责链模式,把处理请求的对象实现成职责对象,然后构造链,当请求在这个链中传递的时候,会根据运行状态判断。

2.在请求处理者不明确的情况下向多个对象中的一个提交请求。

3.需要动态指定处理一个请求的对象集合

五、职责链模式的实现

Handler类,定义一个处理请求的接口

//管理者--Handler类,定义一个处理请求的接口abstract class Manager{    protected string name;    //管理者上级    protected Manager superior;    public Manager(string name)    {        this.name = name;    }     //设置管理者上级---关键的方法    public void SetSuperior(Manager superior)    {        this.superior = superior;    }    abstract public void RequestApplications(Request request);}

具体处理类,处理它所负责的请求,可访问它的后继者,如果可处理就处理,否则请求转到后继者

一、什么是职责链模式

客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链。使编程更有灵活性。

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。其过程实际上是一个递归调用。

要点主要是:

1、有多个对象共同对一个任务进行处理。

2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。

3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。

4、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。

二、职责链模式的结构

责任链模式涉及到的角色如下所示:

  • 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

  • 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家三、职责链模式的优缺点

优点:

职责链模式的最主要功能就是:动态组合,请求者和接受者解耦。

请求者和接受者松散耦合:请求者不需要知道接受者,也不需要知道如何处理。每个职责对象只负责自己的职责范围,其他的交给后继者。各个组件间完全解耦。

动态组合职责:职责链模式会把功能分散到单独的职责对象中,然后在使用时动态的组合形成链,从而可以灵活的分配职责对象,也可以灵活的添加改变对象职责。

缺点:

产生很多细粒度的对象:因为功能处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完,需要很多的职责对象,会产生大量的细粒度职责对象。

不一定能处理:每个职责对象都只负责自己的部分,这样就可以出现某个请求,即使把整个链走完,都没有职责对象处理它。这就需要提供默认处理,并且注意构造链的有效性。

四、职责链模式的使用场景

1.如果有多个对象可以处理同一个请求,但是具体由哪个对象处理是由运行时刻动态决定的,这种对象就可以使用职责链模式,把处理请求的对象实现成职责对象,然后构造链,当请求在这个链中传递的时候,会根据运行状态判断。

2.在请求处理者不明确的情况下向多个对象中的一个提交请求。

3.需要动态指定处理一个请求的对象集合

五、职责链模式的实现

Handler类,定义一个处理请求的接口

//管理者--Handler类,定义一个处理请求的接口abstract class Manager{    protected string name;    //管理者上级    protected Manager superior;    public Manager(string name)    {        this.name = name;    }     //设置管理者上级---关键的方法    public void SetSuperior(Manager superior)    {        this.superior = superior;    }    abstract public void RequestApplications(Request request);}

具体处理类,处理它所负责的请求,可访问它的后继者,如果可处理就处理,否则请求转到后继者

//"经理类"就可以去继承这个"管理者"类,只需要重写"申请请求"的方法就可以//经理类class CommonManager : Manager{    public CommonManager(string name) : base(name) { }     public override void RequestApplications(Request request)    {        //经理的权限可批准下属两天内的请假        if (request.RequestType == "请假" && request.Number <= 2)        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else        {            //其他的申请都要转到上级            if (superior != null)                superior.RequestApplications(request);        }    }}//"总监类"同样继承这个"管理者"类//总监类class Majordomo : Manager{    public Majordomo(string name) : base(name) { }     public override void RequestApplications(Request request)    {        //总监的权限可批准下属五天内的请假        if (request.RequestType == "请假" && request.Number <= 5)        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else        {            //其他的申请都要转到上级            if (superior != null)                superior.RequestApplications(request);        }    }}//"总经理"的权限就是全部处理//总监类class GeneralManager : Manager{    public GeneralManager(string name) : base(name) { }     public override void RequestApplications(Request request)    {        //总经理的权限可批准下属任意天数的请假        if (request.RequestType == "请假")        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else if (request.RequestType == "加薪"&&request.Number<=500)        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else if (request.RequestType == "加薪" && request.Number > 500)        {            Console.WriteLine("{0}:{1}数量{2}再说吧", name, request.RequestContent, request.Number);        }    }}

申请类

//申请class Request{    //申请类别    private string requestType;    public string RequestType    {        get { return requestType; }        set { requestType = value; }    }     //申请内容    private string requestContent;    public string RequestContent    {        get { return requestContent; }        set { requestContent = value; }    }     //数量    private int number;    public int Number    {        get { return number; }        set { number = value; }    }}

客户端代码

class Program{    //客户端代码    static void Main(string[] args)    {        CommonManager jinli = new CommonManager("张三");        Majordomo zongjian = new Majordomo("李四");        GeneralManager zongjinli = new GeneralManager("王五");        //设置上级        jinli.SetSuperior(zongjian);        zongjian.SetSuperior(zongjinli);         Request request = new Request();        request.RequestType = "请假";        request.RequestContent = "XX请假";        request.Number = 1;        jinli.RequestApplications(request);         Request request2 = new Request();        request.RequestType = "加薪";        request.RequestContent = "XX加薪";        request.Number = 500;        jinli.RequestApplications(request);         Console.Read();    }}

六、总结

对于责任链中的一个处理者对象,有两个行为。一是处理请求,二是将请求传递到下一节点,不允许某个处理者对象在处理了请求后又将请求传送给上一个节点的情况。

对于一条责任链来说,一个请求最终只有两种情况。一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称为纯的责任链模式,后一种为不纯的责任链。实际中大多为不纯的责任链。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

//"经理类"就可以去继承这个"管理者"类,只需要重写"申请请求"的方法就可以//经理类class CommonManager : Manager{    public CommonManager(string name) : base(name) { }     public override void RequestApplications(Request request)    {        //经理的权限可批准下属两天内的请假        if (request.RequestType == "请假" && request.Number <= 2)        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else        {            //其他的申请都要转到上级            if (superior != null)                superior.RequestApplications(request);        }    }}//"总监类"同样继承这个"管理者"类//总监类class Majordomo : Manager{    public Majordomo(string name) : base(name) { }     public override void RequestApplications(Request request)    {        //总监的权限可批准下属五天内的请假        if (request.RequestType == "请假" && request.Number <= 5)        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else        {            //其他的申请都要转到上级            if (superior != null)                superior.RequestApplications(request);        }    }}//"总经理"的权限就是全部处理//总监类class GeneralManager : Manager{    public GeneralManager(string name) : base(name) { }     public override void RequestApplications(Request request)    {        //总经理的权限可批准下属任意天数的请假        if (request.RequestType == "请假")        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else if (request.RequestType == "加薪"&&request.Number<=500)        {            Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);        }        else if (request.RequestType == "加薪" && request.Number > 500)        {            Console.WriteLine("{0}:{1}数量{2}再说吧", name, request.RequestContent, request.Number);        }    }}

申请类

//申请class Request{    //申请类别    private string requestType;    public string RequestType    {        get { return requestType; }        set { requestType = value; }    }     //申请内容    private string requestContent;    public string RequestContent    {        get { return requestContent; }        set { requestContent = value; }    }     //数量    private int number;    public int Number    {        get { return number; }        set { number = value; }    }}

客户端代码

class Program{    //客户端代码    static void Main(string[] args)    {        CommonManager jinli = new CommonManager("张三");        Majordomo zongjian = new Majordomo("李四");        GeneralManager zongjinli = new GeneralManager("王五");        //设置上级        jinli.SetSuperior(zongjian);        zongjian.SetSuperior(zongjinli);         Request request = new Request();        request.RequestType = "请假";        request.RequestContent = "XX请假";        request.Number = 1;        jinli.RequestApplications(request);         Request request2 = new Request();        request.RequestType = "加薪";        request.RequestContent = "XX加薪";        request.Number = 500;        jinli.RequestApplications(request);         Console.Read();    }}

"如何理解Java设计模式的职责链模式"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

处理 对象 职责 模式 客户 客户端 任务 动态 上级 下家 接受者 接口 数量 管理者 管理 功能 多个 总监 方法 权限 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 清远自主可控软件开发 数据库中备份用什么技术实现 企业信息网络安全管理办法 中兴通讯的软件开发有什么部门 静安区电子软件开发售后保障 怎么用云服务器管理亚马逊店铺 航天科工四院四部网络安全面试 谁能攻击rust服务器 部门网络安全检查表 新大陆软件开发怎么样 数据库和三级学的东西不一样 维斯塔斯网络安全事件 大数据服务器供货概念股 广东前端软件开发价格 众商网络技术有限公司 数据库定时备份任务怎么查看 如何搭建一个ip服务器 实时数据库与关系数据库 网络安全网站设计工作室 sql数据库中文件有哪些 泰拉瑞亚免费的官方服务器 小红书抽奖链接未连接服务器 网络技术基础进制转换 闵行区营销软件开发报价表 佰威网络技术深圳有限公司 金智维软件开发的待遇怎么样 锐思数据库怎样查多年数据 日版苹果5打不开数据库 开封计算机网络技术专业 mysql数据库服务器介绍
0