两种语言实现设计模式(C++和Java)(十四:责任链模式)


责任链模式实现为请求创建了一个接收者对象的链。当请求的直接执行者无法实现请求时,会将请求传递给链的上一级进行处理。这种传递往往可以通过让接收者包含另一个接收者的引用的方式实现。

责任链模式是一种对象行为型模式,其主要优点如下。

  1. 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
  2. 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  3. 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  4. 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  5. 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

其主要缺点如下。

  1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

UML:

举例:当在公司中请假,公司规定根据请假的天数和事由调整批复对象,首先是项目经理Project Manager, 不能批复找Department Manager, 再不能上升到总经理President。

C++实现:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class Request{
 6 public:
 7     int level;
 8 };
 9
10 class Manager{
11 public:
12     Manager(string _name){name = _name;}
13     void setSuccessor(Manager* manager){nextLevel = manager;}
14     virtual void GetRequest(Request* request)=0;
15 protected:
16     Manager* nextLevel;
17     string name;
18 };
19
20 class ProjectManager:public Manager{
21 public:
22     ProjectManager(string _name):Manager(_name){}
23     virtual void GetRequest(Request *request){
24         if (request->level <= 1){
25             cout << name << " handle it" << endl;
26         } else {
27             nextLevel->GetRequest(request);
28         }
29     }
30 };
31
32 class DepartmentManager:public Manager{
33 public:
34     DepartmentManager(string _name):Manager(_name){}
35     virtual void GetRequest(Request *request){
36         if (request->level <= 2){
37             cout << name << " handle it" << endl;
38         } else {
39             nextLevel->GetRequest(request);
40         }
41     }
42 };
43
44 class President:public Manager{
45 public:
46     President(string _name):Manager(_name){}
47     virtual void GetRequest(Request *request){
48         cout << name << " handle it" << endl;
49     }
50 };
51
52 int main()
53 {
54     Request *request = new Request();
55     request->level = 3;
56     Manager *projectManager = new ProjectManager("Project Manager: Alice");
57     Manager *departmentManager = new DepartmentManager("Department manager: Helen");
58     Manager *president = new President("President: Chalice");
59     projectManager->setSuccessor(departmentManager);
60     departmentManager->setSuccessor(president);
61     projectManager->GetRequest(request);
62     return 0;
63 }

Java:

 1 public class Request {
 2     int level;
 3 }
 4
 5 public abstract class Manager {
 6
 7     private Manager next;
 8
 9     public void setNext(Manager next){
10         this.next = next;
11     }
12
13     public Manager getNext(){
14         return next;
15     }
16
17     public abstract void handleRequest(Request request);
18 }
19
20 public class ProjectManager extends Manager {
21
22     @Override
23     public void handleRequest(Request request) {
24         if (request.level <= 1){
25             System.out.println("Project Manager handle request");
26         } else {
27             this.getNext().handleRequest(request);
28         }
29     }
30 }
31
32 public class DepartmentManager extends Manager {
33
34     @Override
35     public void handleRequest(Request request) {
36         if (request.level <= 2){
37             System.out.println("Department manager handle request");
38         } else {
39             this.getNext().handleRequest(request);
40         }
41     }
42 }
43
44 public class President extends Manager {
45
46     @Override
47     public void handleRequest(Request request) {
48         System.out.println("President handle request");
49     }
50 }
51
52 public class Main {
53
54     public static void main(String[] args) {
55         Manager projectManager = new ProjectManager();
56         Manager departmentManager = new DepartmentManager();
57         Manager president = new President();
58         projectManager.setNext(departmentManager);
59         departmentManager.setNext(president);
60         Request request = new Request();
61         request.level = 3;
62         projectManager.handleRequest(request);
63     }
64 }

原文地址:https://www.cnblogs.com/Asp1rant/p/11278606.html

时间: 2024-10-31 11:46:50

两种语言实现设计模式(C++和Java)(十四:责任链模式)的相关文章

java23种设计模式之十:责任链模式

最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式. 一.什么样的场景下会选择用责任链模式 我们在进行业务逻辑判断时,需要根据传入参数类型的不同做出不同的处理,如果在传入的参数类型相对较少的情况时,可以用if...else来做判断,这样的确是没有什么问题的,但是如果后期由于业务系统的扩展,导致参数类型会随之延伸出很多种不同的处理,这时就需要用责任链模式来抒代码重构,这样会让代码封装的更好.更简洁,阅读性更强,后期如果

设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合.将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理. UML类图: 主要包含: Handler:定义了一个处理请求的接口,实现了定义后继者的方法. ConcreteHandler:处理各自负责的请求,假设不能处

设计模式学习笔记(六:责任链模式)

1.1概述 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.这就是责任链模式. 责任链模式是使用多个对象处理用户请求的成熟模式,责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成一个责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象,如果能处理用户的请求,就做出处理,不再将用户的请求传递给责任链上的下一个对象:如果不能处理用户的请求,就必须将用户的请求传递给责任链上的下一个对象

JAVA中的责任链模式(CH02)

对责任链CH01做出优化,解决耦合度太高问题 记得上一篇我们使用的是抽象类,然后用子类去继承的方法实现等级的桥接,从而发现了耦合度太高. 为了解决这个问题. 我们本次使用接口进行抽象,然后使用到一个"中介"对所要申请的经费进行自动判断. 这个类似于web的过滤器.让我们来Look一Look吧! 一,首先我们创建一个接口,抽象出审批费用的方法 public interface AbstractHandler { //抽象审批经费的方法,这里有两个参数 //第一个参数是:申请经费 //第二

两种语言实现设计模式(C++和Java)(五:代理模式)

参考:https://blog.csdn.net/lh844386434/article/details/18045671 代理模式指为其他对象提供一种代理以控制对这个对象的访问.这样实现了业务和核心功能分离. Subject: 抽象角色.声明真实对象和代理对象的共同接口.Proxy: 代理角色.代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象.代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装.RealSubj

两种语言实现设计模式(C++和Java)(十六:状态模式)

状态模式对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为. 状态模式是一种对象行为型模式,其主要优点如下. 状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”. 减少对象间的相互依赖.将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖. 有利于程序的扩展.通过定义新的子类很容易地增加新的状态和转换. 状态模式的主要缺点如下. 状态模式的使用必然会增加系统的类与对象

Java设计模式菜鸟系列(十八)责任链模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该请求. 一.uml建模: 二.代码实现 /** * 责任链模式:有多个对象,每个对象持有下一个对象的引用,形成一条链, * * 请求在这条链上传递,直到某一对象决定处理该请求,

设计模式学习笔记(十四:单件模式)

1.1概述 保证一个类仅有一个实例,并提供一个访问它的全局访问点.这就是单件模式的定义. 在某些情况下,我们可能需要某个类只能创建一个对象,即不让用户用该类实例化出多于两个的实例. 例如,在一个公文管理系统中,公文类的实例"公文文件",需要将公章类的实例作为自己的一个成员,以表明自己是一个有效的公文文件,那么系统的设计者就需要保证公章类只有一个实例,不能允许用户使用公章类的构造方法再创建出第2个实例. 单件模式是关于怎样设计一个类,并使该类只有一个实例的成熟模式,该模式的关键是将类的构

设计模式C++实现二十:职责链模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受之间的耦合关系.将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 职责链模式处理中,当客户有一个请求时,请求沿着链传递直到有一个对象处理它,我们在设计的时候也必须保证每一个请求都能被处理.接受者和发送者都没有对方的明确信息,而且链中的每个对象自己也不知道自己处于在链的哪个位置.我们只需要把链设置好,也就是对每个链的节点设置后后或者前节点来承接请求(当当前链节