访问者模式
template<typename T>
class Element
{
public:
virtual void accept(Visitor *vs) = 0;
T & get_data()
{
return data;
}
private:
T data;
};
template<typename T>
class ElementA:public Element<T>
{
public:
void accept(Visitor *vs)
{
vs.visitor(this);
}
};
template<typename T>
class ElementB:public Element
{
public:
void accept(Visitor *vs)
{
vs.visitor(this);
}
};
//visitor实际操作的地方,每增加一个操作就新增一个Visitor派生类
class Visitor
{
public:
virtual void visitor(ElementA *element) = 0;
virtual void visitor(ElementB *element) = 0;
};
class Visitor1:public Visitor
{
public:
void visitor(ElementA *element)
{
}
void visitor(ElementB *element)
{
}
};
class Visitor2:public Visitor
{
public:
void visitor(ElementA *element)
{
}
void visitor(ElementB *element)
{
}
};
优点:
- 对扩展开放,对修改关闭。增加一种新的操作只需要增加一个Visitorn即可
- 一个Visitorn只负责一种操作,单一指责原则
缺点:
- 违反了最少知道原则,降低了封装度
- 违反了依赖倒置原则,依赖了具体类
- 不适合经常新增ElementX的情况