设计模式-访问者模式

来源:互联网 发布:上古卷轴5御姐捏脸数据 编辑:程序博客网 时间:2024/06/16 02:27

访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

例子:男人和女人在不同的状态下会有不同反应,采用访问者模式,可以增加状态很方便
UML:
这里写图片描述

class Man;class Woman;//抽象状态类class Action {public:    virtual void GetManConclusion(Man *man) {}       //男人反应    virtual void GetWomanConclusion(Woman *woman) {} //女人反应};class Person {public:    virtual void Accpet(Action *visitor) = 0;        //获得状态};//男人class Man :public Person {    void Accpet(Action *visitor)    {        visitor->GetManConclusion(this);    }};//女人class Woman :public Person {public:    void Accpet(Action *visitor)    {        visitor->GetWomanConclusion(this);    }};//成功状态class Success :public Action {public:    void GetManConclusion(Man *man)    {        cout << "Man成功时,背后多半有一个伟大的女人" << endl;    }    void GetWomanConclusion(Woman *woman)    {        cout << "Woman成功时,背后多半有一个不成功的男人" << endl;    }};//失败状态class Failed :public Action {public:    void GetManConclusion(Man *man)    {        cout << "Man失败时,闷头喝酒,谁也不用劝" << endl;    }    void GetWomanConclusion(Woman *woman)    {        cout << "Woman失败时,眼泪汪汪,谁也劝不了" << endl;    }};//对象结构class ObjectStructure {private:    list<Person*> elements;public:    void Attach(Person *person)           //添加对象    {        elements.push_back(person);    }    void Detach(Person *person)     //删除对象    {        elements.remove(person);    }    void Display(Action *visitor)    //显示    {        for (auto p : elements)        {            p->Accpet(visitor);        }    }};int main(){    ObjectStructure o;    o.Attach(new Man());    o.Attach(new Woman());    Success *v1 = new Success();    o.Display(v1);    Failed *v2 = new Failed();    o.Display(v2);    system("pause");    return 0;}
1 0
原创粉丝点击