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

    这里发出请求的客户端并不知道哪一个对象会最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任
    image.png
    当客户提交一个请求时,请求是沿着链传递直到一个 ConcreteHandler 对象负责处理它。这样就使得接收者和发送者双方都没有对方的明确消息。

    HINT:注意有可能一个请求到链尾都得不到处理。

    1. #include <iostream>
    2. #include <memory>
    3. #include <vector>
    4. class Handler {
    5. public:
    6. void setHandle(const std::shared_ptr<Handler> &handle) { handle_ = handle; }
    7. virtual void handleRequest(int request) = 0;
    8. virtual ~Handler() = default;
    9. protected:
    10. std::shared_ptr<Handler> handle_;
    11. };
    12. class ConcreteHandler1 final : public Handler {
    13. public:
    14. void handleRequest(int request) override {
    15. if (request >= 0 && request <= 10) {
    16. std::cout << "ConcreteHandler1 handle request: " << request << '\n';
    17. } else if (handle_ != nullptr) {
    18. handle_->handleRequest(request);
    19. }
    20. }
    21. virtual ~ConcreteHandler1() = default;
    22. };
    23. class ConcreteHandler2 final : public Handler {
    24. public:
    25. void handleRequest(int request) override {
    26. if (request >= 10 && request <= 20) {
    27. std::cout << "ConcreteHandler2 handle request: " << request << '\n';
    28. } else if (handle_ != nullptr) {
    29. handle_->handleRequest(request);
    30. }
    31. }
    32. virtual ~ConcreteHandler2() = default;
    33. };
    34. class ConcreteHandler3 final : public Handler {
    35. public:
    36. void handleRequest(int request) override {
    37. if (request >= 20 && request <= 30) {
    38. std::cout << "ConcreteHandler3 handle request: " << request << '\n';
    39. } else if (handle_ != nullptr) {
    40. handle_->handleRequest(request);
    41. }
    42. }
    43. virtual ~ConcreteHandler3() = default;
    44. };
    45. auto main() -> int {
    46. std::shared_ptr<Handler> p1 = std::make_shared<ConcreteHandler1>();
    47. std::shared_ptr<Handler> p2 = std::make_shared<ConcreteHandler2>();
    48. std::shared_ptr<Handler> p3 = std::make_shared<ConcreteHandler3>();
    49. p1->setHandle(p2);
    50. p2->setHandle(p3);
    51. std::vector<int> vec = {2, 5, 14, 22, 18, 3, 27, 20};
    52. for (auto i : vec) {
    53. p1->handleRequest(i);
    54. }
    55. return 0;
    56. }