设计模式-行为-Visitor(访问者)模式
问题:
oop开发中经常遇到需求变更,设计好的一个系统原型,客户的新需求来了,我们不得不更改已有的饿设计,最常见的方案就是
添加新类 或 新方法 来实现需求,这样机会不停的打补丁,设计不可能封闭,
访问者模式就是把要变动的 ,更新的 封装到一个类中(访问操作),由待更改的类提供一个接受接口,在不改变数据结构的情况下
,添加新功能(不修改Element的条件下 添加新操作,可通过扩展子类)
这里涉及到一个Double Dispatch 问题
具体调用哪一个Accept 由2个决定因素
- Accept是多态操作,所以要具体的Element 子类
- 因为Accept 参数类型是Visitor 要实际ConcreateVisitor才能决定。
所以要派发2次,访问者模式就是Double Dispatch的一种实现
关于double dispatch 在 http://my.oschina.net/kkkkkkkkkkkkk/blog/671305 阐述
- Visitor 可以为每个Element写一个访问接口,也可以通过重载或 RTTI 来简化接口的设计
#include "PublicHeaders.h" #pragma once class Visitor; class Element { public: void Print() { cout << " this is element" << __FUNCTION__ << endl; } /** * @brief the interface of visitor's visit */ virtual void Accept(Visitor *visitor) = 0; }; class Visitor { public: virtual void VisitElementA(Element*ele) = 0; }; class ConCreateVisitor :public Visitor { public: void VisitElementA(Element *ele) { ele->Print(); } }; class ConCreateElementA :public Element { public: virtual void Accept(Visitor *visitor)override { visitor->VisitElementA(this); } }; void testVisitor() { Element *ele = new ConCreateElementA; Visitor *vis = new ConCreateVisitor; ele->Accept(vis); }