zoukankan      html  css  js  c++  java
  • Chain of Responsibility Pattern

    1.Chain of Responsibility模式:将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求(可能需要提供一个默认处理所有请求的类,例如MFC中的CwinApp类)。

    2.Chain of Responsibility Pattern 结构图

    3.实现

     1 #ifndef _HANDLE_H_ 
     2 #define _HANDLE_H_
     3 
     4 class Handle 
     5 { 
     6 public: 
     7     virtual ~Handle();
     8     virtual void HandleRequest() = 0;
     9     void SetSuccessor(Handle* succ);
    10     Handle* GetSuccessor();
    11 
    12 protected: 
    13     Handle();
    14     Handle(Handle* succ);
    15 
    16 private: 
    17     Handle* _succ; 
    18 };
    19 
    20 class ConcreteHandleA:public Handle 
    21 { 
    22 public: 
    23     ConcreteHandleA();
    24     ~ConcreteHandleA();
    25     ConcreteHandleA(Handle* succ);
    26     void HandleRequest();
    27 
    28 protected:
    29 private:
    30 };
    31 
    32 class ConcreteHandleB:public Handle 
    33 { 
    34 public: 
    35     ConcreteHandleB();
    36     ~ConcreteHandleB();
    37     ConcreteHandleB(Handle* succ);
    38     void HandleRequest();
    39 protected:
    40 private:
    41 };
    42 
    43 #endif
    Handle.h
     1 #include "Handle.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 Handle::Handle()
     6 { 
     7     _succ = 0;
     8 }
     9 Handle::~Handle() 
    10 { 
    11     delete _succ; 
    12 }
    13 Handle::Handle(Handle* succ) 
    14 { 
    15     this->_succ = succ; 
    16 }
    17 void Handle::SetSuccessor(Handle* succ) 
    18 { 
    19     _succ = succ;
    20 }
    21 Handle* Handle::GetSuccessor() 
    22 {
    23     return _succ;
    24 }
    25 void Handle::HandleRequest() 
    26 {
    27 
    28 }
    29 ConcreteHandleA::ConcreteHandleA() 
    30 {
    31 
    32 }
    33 ConcreteHandleA::ConcreteHandleA(Handle* succ):Handle(succ) 
    34 {
    35 
    36 }
    37 ConcreteHandleA::~ConcreteHandleA() 
    38 {
    39 
    40 }
    41 void ConcreteHandleA::HandleRequest() 
    42 { 
    43     if (this->GetSuccessor() != 0) 
    44     { 
    45         cout<<"ConcreteHandleA 我把处理权给后继节点....."<<endl; 
    46         this->GetSuccessor()->HandleRequest(); 
    47     } 
    48     else 
    49     { 
    50         cout<<"ConcreteHandleA 没有后继了,我必须自己处理...."<<endl; 
    51     } 
    52 }
    53 ConcreteHandleB::ConcreteHandleB() 
    54 {
    55 
    56 }
    57 ConcreteHandleB::ConcreteHandleB(Handle* succ):Handle(succ) 
    58 {
    59 
    60 }
    61 ConcreteHandleB::~ConcreteHandleB() 
    62 {
    63 
    64 }
    65 void ConcreteHandleB::HandleRequest() 
    66 { 
    67     if (this->GetSuccessor() != 0) 
    68     { 
    69         cout<<"ConcreteHandleB 我把处理权给后继节点....."<<endl; 
    70         this->GetSuccessor()->HandleRequest(); 
    71     } 
    72     else 
    73     { 
    74         cout<<"ConcreteHandleB 没有后继了,我必须自己处理...."<<endl;
    75     }
    76 }
    Handle.cpp
     1 #include "Handle.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 int main(int argc,char* argv[]) 
     6 { 
     7     Handle* h1 = new ConcreteHandleA();
     8     Handle* h2 = new ConcreteHandleB();
     9     h1->SetSuccessor(h2);
    10     h1->HandleRequest();
    11     return 0; 
    12 }
    main.cpp
  • 相关阅读:
    代码、复制[置顶] 跑起来,第一个sshby小雨
    返回、参数了解Javascript函数:parseInt()by小雨
    代码、复制Javascript执行效率小结by小雨
    图片、JQuery学习笔记(图片的展开和伸缩)by小雨
    登录、项目Spring mvc Session拦截器by小雨
    社区、标签jsp中获取状态怎么写?by小雨
    升级、地方LKDBHelper 使用FMDB 对数据库的自动操作by小雨
    广播、应用Android BroadcastReceiver(一)by小雨
    调试、手机手游开发知识(三)--NDK联机调试by小雨
    设置、数值【Cocos2DX 】初窥门径(11)CCUserDefault:保存数据by小雨
  • 原文地址:https://www.cnblogs.com/programmer-wfq/p/4672957.html
Copyright © 2011-2022 走看看