• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0

            來自于《大話設計模式》
            訪問者模式(Visitor):
            表示一個作用于某對象結構中的個元素的操作。它是你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

            行為型

            UML 類圖:



            代碼實現 C++:
              1 #include <iostream>
              2 #include <list>
              3 #include <algorithm>
              4 #include <string>
              5 using namespace std;
              6 
              7 class Action;
              8 
              9 class Person
             10 {
             11 protected:
             12     string name;
             13 public:
             14     Person(const string& s = "Person") : name(s) {}
             15     virtual void Accept(Action* visitor) = 0;
             16     virtual string getName()
             17     {
             18         return name;
             19     }
             20 };
             21 
             22 class Man;
             23 class Woman;
             24 
             25 class Action
             26 {
             27 protected:
             28     string name;
             29 public:
             30     Action(const string& s = "Action") : name(s) {}
             31     virtual void GetManConclusion(Man* m) = 0;
             32     virtual void GetWomanConclusion(Woman* w) = 0;
             33 };
             34 
             35 class Man : public Person
             36 {
             37 public:
             38     Man(const string& s = "Man") : Person(s) {}
             39     virtual void Accept(Action* visitor)
             40     {
             41         visitor->GetManConclusion(this);
             42     }
             43 };
             44 
             45 class Woman : public Person
             46 {
             47 public:
             48     Woman(const string& s = "Woman") : Person(s) {}
             49     virtual void Accept(Action* visitor)
             50     {
             51         visitor->GetWomanConclusion(this);
             52     }
             53 };
             54 
             55 class Success : public Action
             56 {
             57 public:
             58     Success(const string& s = "Success") : Action(s) {}
             59     virtual void GetManConclusion(Man* m)
             60     {
             61         cout << name << endl;
             62         cout << m->getName() << endl;
             63         cout << "1" << endl;
             64     }
             65     virtual void GetWomanConclusion(Woman* w)
             66     {
             67         cout << name << endl;
             68         cout << w->getName() << endl;
             69         cout << "2" << endl;
             70     }
             71 };
             72 
             73 class Failing : public Action
             74 {
             75 public:
             76     Failing(const string& s = "Failing") : Action(s) {}
             77     virtual void GetManConclusion(Man* m)
             78     {
             79         cout << name << endl;
             80         cout << m->getName() << endl;
             81         cout << "3" << endl;
             82     }
             83     virtual void GetWomanConclusion(Woman* w)
             84     {
             85         cout << name << endl;
             86         cout << w->getName() << endl;
             87         cout << "4" << endl;
             88     }
             89 };
             90 
             91 class Amativeness : public Action
             92 {
             93 public:
             94     Amativeness(const string& s = "Amativeness") : Action(s) {}
             95     virtual void GetManConclusion(Man* m)
             96     {
             97         cout << name << endl;
             98         cout << m->getName() << endl;
             99         cout << "5" << endl;
            100     }
            101     virtual void GetWomanConclusion(Woman* w)
            102     {
            103         cout << name << endl;
            104         cout << w->getName() << endl;
            105         cout << "6" << endl;
            106     }
            107 };
            108 
            109 class Marriage : public Action
            110 {
            111 public:
            112     Marriage(const string& s = "Marriage") : Action(s) {}
            113     virtual void GetManConclusion(Man* m)
            114     {
            115         cout << name << endl;
            116         cout << m->getName() << endl;
            117         cout << "7" << endl;
            118     }
            119     virtual void GetWomanConclusion(Woman* w)
            120     {
            121         cout << name << endl;
            122         cout << w->getName() << endl;
            123         cout << "8" << endl;
            124     }
            125 };
            126 
            127 class ObjectStructure
            128 {
            129 private:
            130     list<Person*> elements;
            131 public:
            132     ObjectStructure() {}
            133     ~ObjectStructure()
            134     {
            135         for (list<Person*>::iterator iter = elements.begin(); iter != elements.end(); ++iter)
            136         {
            137             delete (*iter);
            138         }
            139     }
            140     void Attach(Person* element)
            141     {
            142         elements.push_back(element);
            143     }
            144     void Detach(Person* element)
            145     {
            146         list<Person*>::iterator iter = find(elements.begin(), elements.end(), element);
            147         if (iter != elements.end())
            148         {
            149             elements.erase(iter);
            150         }
            151     }
            152     void Display(Action* visitor)
            153     {
            154         for (list<Person*>::iterator iter = elements.begin(); iter != elements.end(); ++iter)
            155         {
            156             (*iter)->Accept(visitor);
            157         }
            158     }
            159     int size()
            160     {
            161         return elements.size();
            162     }
            163 };
            164 
            165 int main()
            166 {
            167     ObjectStructure o;
            168     o.Attach(new Man);
            169     o.Attach(new Woman);
            170 
            171     cout << o.size() << endl;
            172 
            173     Success* v1 = new Success;
            174     o.Display(v1);
            175     Failing* v2 = new Failing;
            176     o.Display(v2);
            177     Amativeness* v3 = new Amativeness;
            178     o.Display(v3);
            179     Marriage* v4 = new Marriage;
            180     o.Display(v4);
            181 
            182     delete v4;
            183     delete v3;
            184     delete v2;
            185     delete v1;
            186 
            187     return 0;
            188 }
            posted on 2011-04-30 15:21 unixfy 閱讀(456) 評論(0)  編輯 收藏 引用
            国产V综合V亚洲欧美久久| 欧美日韩精品久久久久| 无码人妻精品一区二区三区久久久| 大香伊人久久精品一区二区| 亚洲va久久久噜噜噜久久狠狠| 日韩精品无码久久久久久| 99久久99久久久精品齐齐| 久久99国产精品久久| 色综合久久久久综合99| 久久香蕉超碰97国产精品| 99久久精品这里只有精品 | 亚洲人成伊人成综合网久久久| 99精品国产在热久久无毒不卡 | 亚洲综合熟女久久久30p| 国产精品久久成人影院| 伊人精品久久久久7777| 久久96国产精品久久久| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 亚洲精品国产成人99久久| 久久99国产精品久久99小说 | 久久婷婷成人综合色综合| 91精品日韩人妻无码久久不卡 | 亚洲第一极品精品无码久久 | 久久99久久99精品免视看动漫| 精品久久国产一区二区三区香蕉 | 精品国产乱码久久久久软件| 人人狠狠综合久久亚洲婷婷| 人妻无码久久一区二区三区免费| 久久九九久精品国产免费直播| 精品久久久久久无码中文字幕一区| 久久婷婷是五月综合色狠狠| 久久久久综合网久久| 欧美一区二区三区久久综合| 久久久久99这里有精品10| 久久久久久国产精品免费免费| 久久精品国内一区二区三区 | 久久婷婷色综合一区二区| 久久96国产精品久久久| 99国产欧美精品久久久蜜芽| 久久综合九色综合网站| 久久亚洲精品无码AV红樱桃|