行为模式8-访问者模式

2018-04-16  本文已影响0人  sunblog

行为模式8-访问者模式

访问者模式Visitor

意图

表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

问题思考

一个代码扫描器。我们要进行类型检查、代码优化、变量使用前是否赋值。

适用性

效果

类图

visitor

实现

class Visitor;

class Element {
public:
    virtual void Accept(Visitor &v) = 0;
};

class ConcreteElement1;
class ConcreteElement2;

class Visitor {
public:
    virtual void VisitConcreteElement1(ConcreteElement1 *element1) = 0;

    virtual void VisitConcreteElement2(ConcreteElement2 *element2) = 0;
};

class ConcreteElement1 : public Element {
public:
    void Accept(Visitor &v) override {
        v.VisitConcreteElement1(this);
    }
};

class ConcreteElement2 : public Element {
public:
    void Accept(Visitor &v) override {
        v.VisitConcreteElement2(this);
    }
};

class ConcreteVisitorA : public Visitor {
public:
    void VisitConcreteElement1(ConcreteElement1 *element1) override {
        std::cout << "type check on element1" << std::endl;
    }

    void VisitConcreteElement2(ConcreteElement2 *element2) override {
        std::cout << "type check on element2" << std::endl;
    }
};

class ConcreteVisitorB : public Visitor {
public:
    void VisitConcreteElement1(ConcreteElement1 *element1) override {
        std::cout << "do performance check on element1" << std::endl;
    }

    void VisitConcreteElement2(ConcreteElement2 *element2) override {
        std::cout << "do performance check on element2" << std::endl;
    }
};

注意:使用Visitor模式,必须定义两个类层次:一个对应于接受操作的元素(Element层次),另一个对应于定义元素的操作的访问者(ElementVisitor层次)。给Visitor增加一个子类,即可给Element增加一个操作。如果Element多了一个子类,那么每个Visitor子类要修改接口,增加对该Element的处理。

上一篇 下一篇

猜你喜欢

热点阅读