访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变类的前提下定义作用于这些元素的操作。
访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。
UML图如下:
代码如下:
class Action
{
public:
Action() {}
virtual ~Action() {}
virtual void GetManConclusion(Man* __m) {}
virtual void GetWomanConclusion(Woman* __w) {}
};
class Amativeness : public Action
{
public:
Amativeness() {}
~Amativeness() {}
virtual void GetManConclusion(Man* __m)
{
std::cout << typeid(__m).name() << typeid(this).name() << ",KNOW." << std::endl;
}
virtual void GetWomanConclusion(Woman* __w)
{
std::cout << typeid(__w).name() << typeid(this).name() << ",NOT KNOW." << std::endl;
}
};
class Failing : public Action
{
public:
Failing() {}
~Failing() {}
virtual void GetManConclusion(Man* __m)
{
std::cout << typeid(__m).name() << typeid(this).name() << ",Drink." << std::endl;
}
virtual void GetWomanConclusion(Woman* __w)
{
std::cout << typeid(__w).name() << typeid(this).name() << ",Cry." << std::endl;
}
};
class Success : public Action
{
public:
Success() {}
~Success() {}
virtual void GetManConclusion(Man* __m)
{
std::cout << typeid(__m).name() << typeid(this).name() << ",have a great woman."<<std::endl;
}
virtual void GetWomanConclusion(Woman* __w)
{`这里写代码片`
std::cout << typeid(__w).name() << typeid(this).name() << ",do not have a great man." << std::endl;
}
};
class Person
{
public:
Person() {}
virtual ~Person() {}
virtual void Accept(Action* visitor)
{
}
};
class Woman : public Person
{
public:
Woman() { }
~Woman() {}
virtual void Accept(Action* visitor)
{
visitor->GetWomanConclusion( this);
}
};
class Man : public Person
{
public:
Man(){ }
~Man() {}
virtual void Accept(Action* visitor)
{
visitor->GetManConclusion(this);
}
};
class ObjectStructure
{
private:
std::list<Person*> elements;
public:
ObjectStructure() {}
~ObjectStructure()
{
elements.clear();
}
void Attach(Person* __p)
{
elements.push_back(__p);
}
void Detach(Person* __p)
{
elements.remove(__p);
}
void Display(Action* vistor)
{
for each (Person* __p in elements)
{
__p->Accept(vistor);
}
}
};
//客户端代码
ObjectStructure obj;
Person* pMan = new Man();
Person* pWoman = new Woman();
obj.Attach(pMan);
obj.Attach(pWoman);
Action* pSuc = new Success();
obj.Display(pSuc);
Action* pFail = new Failing();
obj.Display(pFail);
Action* pAmative = new Amativeness();
obj.Display(pAmative);
运行结果如下: