设计模式13——访问者模式

访问者模式中,有一个数据体,添加了各个访问对象。这些访问对象在不同的状态时,会有不同的反应。这种模式中,对象与状态相分离,互不干扰。

Visitor.h内容

  1 #ifndef Visitor_H_H
  2 #define Visitor_H_H
  3
  4
  5 #include <iostream>
  6 #include <vector>
  7 using namespace std;
  8
  9 class State
 10 {
 11 public:
 12     virtual void getManState() = 0;
 13     virtual void getWomanState() = 0;
 14     virtual ~State() {}
 15
 16 };
 17
 18 class StateHappy : public State
 19 {
 20 public:
 21     virtual void getManState(){
 22         cout << "Man drinks when happy!" << endl;
 23     }
 24     virtual void getWomanState(){
 25         cout << "Woman go shopping when happy!" << endl;
 26     }
 27 };
 28
 29
 30 class StateSad : public State
 31 {
 32 public:
 33     virtual void getManState(){
 34         cout << "Man smokes when sad!" << endl;
 35     }
 36     virtual void getWomanState(){
 37         cout << "Woman weeps when sad!" << endl;
 38     }
 39
 40 };
 41
 42
 43 class People
 44 {
 45 public:
 46     virtual void visit(State *state) = 0;
 47     virtual ~People() {}
 48 };
 49
 50 class Man : public People
 51 {
 52 public:
 53     virtual void visit(State *state){
 54         state->getManState();
 55     }
 56 };
 57
 58 class Woman : public People
 59 {
 60 public:
 61     virtual void visit(State *state){
 62         state->getWomanState();
 63     }
 64 };
 65
 66
 67 class Visitor
 68 {
 69 public:
 70     Visitor() : state(NULL) {}
 71     void visit(){
 72         for(size_t i=0; i<vecPeople.size(); ++i){
 73             vecPeople[i]->visit(state);
 74         }
 75     }
 76
 77     void addItem(People *people){
 78         vecPeople.push_back(people);
 79     }
 80
 81     void setState(State *state0) { state = state0; }
 82
 83 private:
 84     vector<People*> vecPeople;
 85     State *state;
 86 };
 87
 88
 89 void VisitorTest()
 90 {
 91     Visitor *visitor = new Visitor();
 92     visitor->addItem(new Man());
 93     visitor->addItem(new Woman());
 94
 95     State *state1 = new StateHappy();
 96     State *state2 = new StateSad();
 97
 98     visitor->setState(state1);
 99     visitor->visit();
100
101     visitor->setState(state2);
102     visitor->visit();
103
104     delete visitor;
105 }
106
107 #endif

运行结果:

实例中,男士和女士在高兴和悲伤时会有不同的动作反应,由一个visitor添加所有People的实例后,设置不同的状态以对每个个体进行访问。

时间: 2024-11-05 17:28:08

设计模式13——访问者模式的相关文章

设计模式之访问者模式(Visitor)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

PHP教程:掌握php设计模式之访问者模式

PHP教程:掌握php设计模式之访问者模式 这篇文章主要帮助大家轻松掌握php设计模式之访问者模式,感兴趣的小伙伴们可以参考一下 访问者模式解决的问题 在我们的代码编写过程当中,经常需要对一些类似的对象添加一些的代码,我们以一个计算机对象打印组成部分为例来看下: /** * 抽象基类 */ abstract class Unit { /** *获取名称 */ abstract public function getName(); } /** * Cpu类 */ class Cpu extends

【设计模式】——访问者模式

访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式结构图 访问者模式使用与数据结构相对比较稳定的系统,即数据结构和作用与结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化.其目的,要把处理从数据结构分离开来.很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易.反之,如果这样的

22.设计模式_访问者模式

一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式的定义 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操作之间的耦合度降低,使得操作集合可以相对自由地改变. 数据结构的每一个节点都可以接受一个访问者的调用

设计模式(17) 访问者模式(VISITOR) C++实现

意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态分析阶段,将源程序表示为一个抽象语法树,编译器需要在抽象语法树的基础上实施某些操作以进行静态语义分析.可能需要定义许多操作以进行类型检查.代码优化.流程分析.检查变量是否在使用前被赋值,等等. 这个需求的特点是:要求对不同的节点进行不同的处理. 常规设计方法:不同的节点封装不同的操作. 缺点是,节点

C#设计模式(22)——访问者模式(Vistor Pattern)

一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式的定义 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操作之间的耦合度降低,使得操作集合可以相对自由地改变. 数据结构的每一个节点都可以接受一个访问者的调用

【设计模式】访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作. 介绍 意图:主要将数据结构与数据操作分离. 主要解决:稳定的数据结构和易变的操作耦合问题. 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些

JAVA设计模式之 访问者模式【Visitor Pattern】

一.概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作.在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为"对象结构",访问者通过遍历对象结构实现对其中存储的元素的逐个操作.访问者模式是一种对象行为型模式. 二.适用场景 当有多种类型的访问者(或是操作者) 对一组被访问者对象集合(或是对象结构)进行操作(其中对象集合也包含多种类型对象

【设计模式】—— 访问者模式Visitor

对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同.此时,就是访问者模式的典型应用了. 应用场景 1 不同的子类,依赖于不同的其他对象 2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法 3 定义的类很少改变,但是执行的操作却经常发生改变. 回到顶部 模式结构 Context 环境角色 class Context{ List<Node> list = new ArrayList(); public void add(Node node) { list.ad