设计模式之职责链模式

职责链模式

定义

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

要点

 职责链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。其URL图如下所示:

在这里插入图片描述

  1. 抽象处理者(Handler):定义一个处理请求的接口,以及搭建一条链,使得请求能够通过handler传播给下一个concretehandle。
  2. 具体处理者(ConcreteHandle):实现具体处理请求的函数,同时,把不能处理的请求通过Handle传递给下一个ConcreteHandle
代码实现

抽象处理者(Handler)

class Handler {
	protected:
		Handler * successor ;
	public:
		Handler() {};
		~Handler() {};
		// 设立下一任传递者 传递的关键部分
		void setSuccessor(Handler * successor) {
			this->successor = successor;
		};
    	// 用于给具体处理者处理请求提供接口
		virtual void HandleRequest(int request) = 0;
};

具体处理者(ConcreteHandler)

class ConcreteHandler1 : public Handler {
	public:
		ConcreteHandler1() {};
		~ConcreteHandler1() {};
		virtual void HandleRequest(int request) {
			if(request > 0 && request <= 10) {
				cout << "request: " << request << "! Boss1 Permited!" << endl;
			} else if(successor != NULL) {
				cout << "request : " << request << "! No, I'll check with my boss!" << endl;
                // 传递的关键点 注意这里用successor指针为主导的!
				successor->HandleRequest(request);
			}
		}
};

class ConcreteHandler2: public Handler {
	public:
		ConcreteHandler2() {};
		~ConcreteHandler2() {};
		virtual void HandleRequest(int request) {
			if(request > 10 && request <= 100) {
				cout << "request : " << request << " ! Boss2 Permited!" << endl;
			} else if(successor != NULL) {
				cout << "request : " << request << " ! No!" << endl;
				// 传递的关键点 注意这里用successor指针为主导的!
                successor->HandleRequest(request);
			}
		}
};

Client(用户端)

int main() {
	Handler * h1 = new ConcreteHandler1();
	Handler * h2 = new ConcreteHandler2();
	// 关键部分设立关联点 把h1和h2通过handler连接起来
	h1->setSuccessor(h2);
	
	h1->HandleRequest(1);
	h1->HandleRequest(10);
	h1->HandleRequest(100);
}

结果显示:

在这里插入图片描述

优点和缺点
优点
  1. 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息
  2. 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  3. 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  4. 责任链简化了对象之间的连接每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  5. 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
缺点
  1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理,到末端不能处理应该做出相应措施。
  2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。
应用场景

 责任链模式比较适合比如一个任务需要多个对象才能完成处理的情况或者代码存在许多if-else判断的情况,例如OA事件审批、分配开发任务等。

 通过职责链能够简化函数中的if-else结构,使得代码冗余减少,有助于解耦,同时若要增加判断条件不必修改原有的函数,仅需增加对象即可,满足开闭原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值