概述
访问者模式是一种将数据操作和数据结构分离的设计模式。
定义
表示要对对象结构的元素执行的操作。它使您可以定义新操作,而无需更改其所操作元素的类。该模式具有行为目的,并且适用于对象。
角色
Visitor:
抽象访问者类ConcreteVisitor:
具体访问者类Element:
抽象元素类ConcreteElement:
具体元素类ObjectStructure:
对象结构类
场景
- 一个对象结构包含许多具有不同接口的对象类,并且您希望根据这些对象的具体类对这些对象执行操作
- 需要对对象结构中的对象执行许多不同且不相关的操作,并且您要避免使用这些操作“污染”它们的类
- 定义对象结构的类很少更改,但是您经常想在结构上定义新的操作
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//抽象访问者类 class Visitor { public: virtual ~Visitor() {} virtual void visitElementA(ConcreteElementA* const element) = 0; virtual void visitElementB(ConcreteElementB* const element) = 0; //... }; //具体访问者类1 class ConcreteVisitor1 : public Visitor { public: ~ConcreteVisitor1() {} void visitElementA(ConcreteElementA * const) { std::cout << "concrete visitor 1: element a visited." << std::endl; } void visitElementB(ConcreteElementB * const) { std::cout << "concrete visitor 1: element b visited." << std::endl; } //... }; //具体访问者类2 class ConcreteVisitor2 : public Visitor { public: ~ConcreteVisitor2() {} void visitElementA(ConcreteElementA * const) { std::cout << "concrete visitor 2: element a visited." << std::endl; } void visitElementB(ConcreteElementB * const) { std::cout << "concrete visitor 2: element b visited." << std::endl; } //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//抽象元素类 class Element { public: virtual ~Element() {} virtual void accept(Visitor & visitor) = 0; //... }; //具体元素类1 class ConcreteElementA : public Element { public: ~ConcreteElementA() {} void accept(Visitor & visitor) { visitor.visitElementA(this); } //... }; //具体元素类2 class ConcreteElementB : public Element { public: ~ConcreteElementB() {} void accept(Visitor & visitor) { visitor.visitElementB(this); } //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
auto main()->int { ConcreteElementA elementA; ConcreteElementB elementB; ConcreteVisitor1 visitor1; ConcreteVisitor2 visitor2; elementA.accept(visitor1); elementA.accept(visotor2); elementB.accept(visitor1); elementB.accept(visitor2); return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 行为型:策略模式09/07
- ♥ 结构型:享元模式09/24
- ♥ 结构型:桥接模式09/24
- ♥ 结构型:代理模式09/23
- ♥ 创建型:抽象工厂模式08/26
- ♥ 行为型:备忘录模式09/25