访问者模式(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;
}