设计模式之访问者模式

访问者模式

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的情况
posted @ 2017-03-08 10:53  txlstars  阅读(98)  评论(0编辑  收藏  举报