访问者模式
templateclass Element{public: virtual void accept(Visitor *vs) = 0; T & get_data() { return data; }private: T data;};template class ElementA:public Element {public: void accept(Visitor *vs) { vs.visitor(this); }};template 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的情况