ChainOfResponsibilityPattern.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <iostream>
  2. using namespace std;
  3. class Handle {
  4. public:
  5. virtual ~Handle() { }
  6. virtual void HandleRequest() = 0;
  7. void SetSuccessor(Handle *succ) {
  8. _succ = succ;
  9. }
  10. Handle* GetSuccessor()const {
  11. return _succ;
  12. }
  13. protected:
  14. Handle() { _succ = nullptr; }
  15. Handle(Handle* succ) {
  16. _succ = succ;
  17. }
  18. private:
  19. Handle* _succ;
  20. };
  21. class ConcreteHandleA :public Handle {
  22. public:
  23. ConcreteHandleA() { }
  24. ConcreteHandleA(Handle* succ)
  25. :Handle(succ) {
  26. }
  27. void HandleRequest() {
  28. if (this->GetSuccessor() != 0) {
  29. cout << "ConcreteHandleA--Successor" << endl;
  30. GetSuccessor()->HandleRequest();
  31. }
  32. else {
  33. cout << "ConcreteHandleA::HandleRequest" << endl;
  34. }
  35. }
  36. };
  37. class ConcreteHandleB :public Handle {
  38. public:
  39. ConcreteHandleB() { }
  40. ConcreteHandleB(Handle* succ)
  41. :Handle(succ) {
  42. }
  43. void HandleRequest() {
  44. if (this->GetSuccessor() != 0) {
  45. cout << "ConcreteHandleB--Successor" << endl;
  46. GetSuccessor()->HandleRequest();
  47. }
  48. else {
  49. cout << "ConcreteHandleB::HandleRequest" << endl;
  50. }
  51. }
  52. };
  53. int main() {
  54. Handle *h1 = new ConcreteHandleA();
  55. Handle *h2 = new ConcreteHandleB(h1);// or h1->SetSuccessor(h2);
  56. h2->HandleRequest();
  57. delete h1;
  58. delete h2;
  59. return 0;
  60. }