zoukankan      html  css  js  c++  java
  • 常见设计模式C++代码实现

      1 #include <cstdlib>
      2 #include <iostream>
      3 
      4 using namespace std;
      5 
      6 //// brige partten:Begin
      7 class bri_Implementor
      8 { 
      9 public:
     10          virtual void optImpl() = 0;
     11 };
     12 
     13 class bri_ImplementorA: public bri_Implementor
     14 { public:
     15          void optImpl() { std::cout << "ImplementA" << std::endl; }       
     16 };
     17 
     18 class bri_Abstract
     19 { public:
     20          bri_Implementor *impl;
     21          void opt() { this->impl->optImpl(); }
     22 };
     23 
     24 void test_bridge()
     25 {
     26      bri_Abstract a;
     27      a.impl = new bri_ImplementorA();
     28      a.opt();   
     29 }
     30 //// brige partten:End
     31 
     32 //// single partten:Begin
     33 class sig_Singlon
     34 { 
     35 public:
     36       int data;
     37       static sig_Singlon * inst;
     38       
     39       static sig_Singlon& instance()
     40       {
     41              if(inst != NULL) {
     42                      return *inst;
     43              }
     44              else {
     45                  inst = new sig_Singlon();
     46                  inst->data = 3;                 
     47                  return *inst;
     48              }
     49       } // instance
     50       
     51       int get_data() { return this->data; }
     52 };
     53 //// single partten:End
     54 
     55 sig_Singlon* sig_Singlon::inst = NULL;
     56 
     57 void test_singlon()
     58 {
     59      std::cout << "Singlon Data is: " <<
     60                sig_Singlon::instance().get_data() << std::endl;     
     61 }
     62 
     63 //// builder partten:Begin
     64 class bui_Product
     65 { public:
     66 };
     67 
     68 class bui_Builder
     69 { public:
     70          virtual void buildPartA() = 0;
     71          virtual void buildPartB() = 0;
     72          virtual bui_Product getResult() = 0;
     73 };
     74 
     75 class bui_BuilderA : public bui_Builder
     76 { public:
     77          void buildPartA(){ std::cout << "BuildA::PartA" << std::endl; }
     78          void buildPartB(){ std::cout << "BuildA::PartB" << std::endl; }
     79          bui_Product getResult(){std::cout << "Build Finish!~" << std::endl;} 
     80 };
     81 
     82 class bui_Director
     83 { public:
     84          static bui_Product construct(bui_Builder * b) {
     85               b->buildPartA();
     86               b->buildPartB();
     87               return b->getResult();     
     88          } // construct       
     89 };
     90 
     91 void test_builder()
     92 {
     93      bui_Director::construct(new bui_BuilderA());
     94 }
     95 //// builder partten:End
     96 
     97 //// prototype parrten:Begin
     98 class proto_Prototype
     99 { public:
    100        int *pdata;
    101        proto_Prototype(int data = 0) { pdata = new int(data); }
    102        proto_Prototype& clone()
    103        {
    104               proto_Prototype* c = new proto_Prototype();             
    105               *(c->pdata) = *(this->pdata); // deeply copy.
    106               return (*c);
    107        } // clone           
    108 }; // proto_Prototype
    109 
    110 void test_prototype()
    111 {
    112      proto_Prototype o1;
    113      *(o1.pdata) = 1;
    114      proto_Prototype o2(o1);
    115      proto_Prototype o3 = o1.clone();
    116      *(o2.pdata) = 2;
    117      *(o3.pdata) = 3;
    118      std::cout << "prototype object1 : " << *(o1.pdata) <<
    119      " , object2: " << *(o2.pdata) <<
    120      ", object3: " << *(o3.pdata) << std::endl;
    121 }
    122 //// prototype parrten:End
    123 
    124 //// adapter parrten:Begin
    125 class adp_Adaptee
    126 { public:
    127          int simu() { std::cout << "simulation signal." << std::endl; }
    128 };
    129 
    130 class adp_Adapter
    131 { public:
    132          virtual void digital() = 0;
    133 };
    134 
    135 class adp_AdapterA
    136 { public:
    137          adp_Adaptee *adaptee;
    138          void digital() { 
    139               adaptee->simu(); 
    140               std::cout << "convert to digital signal now!" << std::endl; 
    141          }
    142 };
    143 
    144 void test_adapter()
    145 {
    146      adp_AdapterA adp;
    147      adp.adaptee = new adp_Adaptee();
    148      adp.digital();
    149 }
    150 //// adapter parrten:End
    151 
    152 //// state partten:Start
    153 enum STA_STATE {STA_START, STA_RUNNING, STA_FINISH, STA_EXIT};
    154 
    155 class sta_State
    156 { public:
    157      virtual void handle() = 0;        
    158 };
    159 
    160 class sta_ConcreteStateStart: public sta_State
    161 { public:
    162      void handle() { std::cout << "Starting..." << std::endl; }
    163 }; 
    164 
    165 class sta_ConcreteStateRunning: public sta_State
    166 { public:
    167      void handle() { std::cout << "Running..." << std::endl; }
    168 }; 
    169 
    170 class sta_ConcreteStateFinish: public sta_State
    171 { public:
    172      void handle() { std::cout << "Finishing..." << std::endl; }
    173 }; 
    174 
    175 class Context
    176 {
    177       enum STA_STATE state;
    178       sta_State *handler;
    179 public:      
    180       Context() { state = STA_START; handler = NULL; }
    181       void request()
    182       {
    183            switch(state)
    184            {
    185              case STA_START:{ 
    186                   handler = new sta_ConcreteStateStart();
    187                   handler->handle();
    188                   delete handler; 
    189                   state = STA_RUNNING;
    190              } break;
    191              case STA_RUNNING:{ 
    192                   handler = new sta_ConcreteStateRunning();                  
    193                   handler->handle();
    194                   delete handler; 
    195                   state = STA_FINISH;
    196              } break;
    197              case STA_FINISH:{ 
    198                   handler = new sta_ConcreteStateFinish();
    199                   handler->handle();
    200                   delete handler;                   
    201                   state = STA_EXIT;
    202              } break;
    203              default: {             
    204                    return;
    205              }
    206            } // switch             
    207       } // request
    208 }; 
    209 
    210 void test_state()
    211 {
    212      Context context;
    213      context.request();
    214      context.request();
    215      context.request();
    216      context.request();    
    217      context.request();    
    218 }
    219 //// state partten:End
    220 
    221 //// component parrten:Start
    222 class com_Component
    223 { public:
    224       virtual void opt() = 0;
    225       virtual void add(com_Component *c) {}
    226       virtual void remove(com_Component *c) {}
    227       virtual com_Component* getChild(int i) { return NULL; }
    228 };
    229 
    230 class com_Leaf: public com_Component
    231 { public:
    232       void opt() { std::cout << "leaf" << std::endl; }
    233 };
    234 #include <vector>
    235 #include <algorithm>
    236 class com_InnerNode: public com_Component
    237 { public:
    238       std::vector<com_Component *> node_set;
    239       void opt()
    240       {
    241            for(int i = 0; i < node_set.size(); ++i)
    242            {
    243                    std::cout << "inner->"; node_set[i]->opt();
    244            } // for
    245       }
    246       void add(com_Component *c) { node_set.push_back(c); }
    247       void remove(com_Component *c) { 
    248            node_set.erase(std::remove(node_set.begin(), node_set.end(), c), node_set.end());
    249       }
    250       com_Component* getChild(int i) { return node_set[i]; }
    251 };
    252 
    253 void test_component()
    254 {
    255      com_InnerNode *root = new com_InnerNode();
    256      root->add(new com_InnerNode());
    257      root->getChild(0)->add(new com_Leaf());
    258      root->getChild(0)->add(new com_Leaf());
    259      root->opt();
    260 }
    261 //// component parrten:End
    262 
    263 //// observer parrten:Start
    264 class obs_Observer
    265 { public:
    266       virtual void update() = 0;
    267 };
    268 
    269 class obs_ObserverA : public obs_Observer
    270 { public:
    271       void update() { std::cout << "obs_ObserverA::update()" << std::endl; }
    272 };
    273 
    274 class obs_Subject
    275 { public:
    276       virtual void attach(obs_Observer *o) = 0;
    277       virtual void detach(obs_Observer *&o) = 0;
    278       virtual void notify() = 0;
    279 };
    280 
    281 class obs_SubjectImplA:public obs_Subject
    282 { public:      
    283       obs_Observer *inst;
    284       void attach(obs_Observer *o) { inst = o; }
    285       void detach(obs_Observer *&o) { o = inst; inst = NULL; }
    286       void notify() { inst->update(); }
    287 };
    288 
    289 void test_observer()
    290 {
    291      obs_SubjectImplA subject;
    292      subject.attach(new obs_ObserverA());
    293      subject.notify();
    294      obs_Observer *observer = NULL;
    295      subject.detach(observer);
    296 }
    297 //// observer parrten:End
    298 
    299 //// vistor parrten:Start
    300 class vis_Vistor;
    301 class vis_Element
    302 { public:
    303       virtual void accept(vis_Vistor *vistor) = 0;
    304 };
    305 
    306 class vis_ConcreteElemA : public vis_Element
    307 { public:
    308       int dta;
    309       void accept(vis_Vistor *vistor);
    310 };
    311 
    312 class vis_ConcreteElemB : public vis_Element
    313 { public:
    314       int dtb;
    315       void accept(vis_Vistor *vistor);
    316 };
    317 
    318 class vis_Vistor
    319 { public:
    320       void vistElemA(vis_ConcreteElemA *a) { a->dta = 911; }
    321       void vistElemB(vis_ConcreteElemB *b) { b->dtb = 101; }
    322 };
    323 
    324 void vis_ConcreteElemA::accept(vis_Vistor *vistor) { vistor->vistElemA(this); }
    325 void vis_ConcreteElemB::accept(vis_Vistor *vistor) { vistor->vistElemB(this); }
    326 
    327 void test_vistor()
    328 {
    329      vis_ConcreteElemA a;
    330      vis_ConcreteElemB b;
    331      vis_Vistor *vistor = new vis_Vistor();
    332      a.accept(vistor);
    333      b.accept(vistor);
    334      std::cout << "ElemA's Value:" << a.dta 
    335                << " ,ElemB's Value:" << b.dtb << std::endl;     
    336 }
    337 //// vistor parrten:End
    338 
    339 int main(int argc, char *argv[])
    340 {
    341     test_vistor();
    342     
    343     system("PAUSE");
    344     return EXIT_SUCCESS;
    345 }
  • 相关阅读:
    project
    类欧几里得算法
    还不熟悉的内容
    Hall定理
    FWT学习笔记
    最小树形图
    BZOJ 3027 [Ceoi2004]Sweet
    多项式除法
    VUE 计算属性和侦听器
    VUE 模板语法
  • 原文地址:https://www.cnblogs.com/icanth/p/2709842.html
Copyright © 2011-2022 走看看