职责链模式C++

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

职责链模式结构图

职责链模式C++_第1张图片
image

职责链模式基本代码

#include 
using namespace std;

// Handle类,处理请求的接口:
class Handle {
protected:
    Handle* successor;
public:
    void SetSuccessor(Handle* s) {
        successor = s;
    }
    virtual void HandleRequest(int request) {
        successor->HandleRequest(request);
    }
};

// ConcreteHandler1 & ConcreteHandler2,具体处理类,处理其负责的请求,如果不能处理就将请求转发给它的后继者:
class ConcreteHandler1 : public Handle {
public:
    void HandleRequest(int request) {
        if (request == 1) cout << "HandleRequest1:" << request << endl;
        else if (successor != NULL) successor->HandleRequest(request);
    }
};

class ConcreteHandler2 : public Handle {
public:
    void HandleRequest(int request) {
        if (request == 2) cout << "HandleRequest2:" << request << endl;
        else if (successor != NULL) successor->HandleRequest(request);
    }
};

// 客户端代码实现:
int main() {
    int request1 = 1;
    int request2 = 2;

    Handle* h1 = new ConcreteHandler1();
    Handle* h2 = new ConcreteHandler2();

    h1->SetSuccessor(h2);   // 设置链
h2->SetSuccessor(h1);

    h1->HandleRequest(request2);  // HandleRequest2:2
    h2->HandleRequest(request1);  // HandleRequest1:1
    delete h1;
    delete h2;
    return 0;
}

应用场景

优点:

  1. 当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。
  2. 接受者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构,结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持所有的候选接受者的引用,这就大大降低了耦合度。
  3. 在客户端设置链结构,增强了给对象指派职责的灵活性。

你可能感兴趣的:(职责链模式C++)