访问者模式(Visitor)介绍

把对象数据和操作分离,使操作可以独立演化。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式是适用于那些数据结构比较稳定的模式。这个算是在C里面退化的不是那么厉害的一种模式思想, 或者说这种方法和C实现天然结合而不成为模式。因为C里面本来就很少将数据和访问方法封装在一起,数据的组织形式是数据结构的范畴,访问函数是代码流程设计的范畴。

面向对象实现的访问者模式

以下是用面向对象实现的访问者模式。两个帽子子类实例的不包含特有访问方法,也就是说,设计上只是想把这两个子类当作数据。帽子有两种访问方法price_show和size_show。

这里变化的因素有两个,不同的帽子和不同的访问方法(price和size)。解决不同帽子的方法是增加不同的帽子具体类。解决不同的访问方法是不同的具体访问方法子类price_show和size_show。这就是所谓的把对象数据和操作分离。

可以看出,虽然是对象数据和操作分离,但是数据的父类也必须提供了统一的访问接口,只不过不需要在子类里有特定的访问接口。

如果增加别的访问方法,就继续增加访问抽象父类和子类,并且修改帽子的抽象父类。

public abstract class Visitor { public abstract void visitor(capA a); public abstract void visitor(capB b); } public class price_show extends Visitor{ public int visitor(capA a) { return a.getPrice(); } public int visitor(capB b) { return b.getPrice(); }       } public class size_show extends Visitor{ public int visitor(capA a) { return a.getsize(); } public int visitor(capB b) { return b.getsize(); }       }public abstract class cap {protected int size;protected int price;public cap (int size,int price){this.size = size;this.price = price;}public int getsize() {return this.size;}public int getPrice() {return this.price;}public abstract void accept(Visitor visitor);}public class capA extends cap{ public capA(int size, int price) { super(size, price); } public void accept(Visitor visitor) { visitor.visitor(this); } }public class capB extends cap{ public capB(int size, int price) { super(size, price); } public void accept(Visitor visitor) { visitor.visitor(this); } } public class shop { List<cap> list = new ArrayList<cap>(); public void accept(Visitor visitor){ Iterator<cap> iterator = list.iterator(); while (iterator.hasNext()) { iterator.next().accept(visitor); } } public void addcap(cap cap){ list.add(cap); } public void removecap(cap cap){ list.remove(cap); } }public class Client { public static void main(int[] args) { cap a = new capA(38, 201); cap b = new capB(41, 95); shop shop = new shop(); shop.addcap(a); shop.addcap(b); Visitor price_show = new price_show();           Visitor size_show = new size_show(); shop.accept(price_show); shop.accept(size_show); } }

C实现的访问者模式

struct cap{int size;int price;}struct cap shop[] ={[0] = {.size = 38,.price = 201},[1] = {.size = 41,.price = 95},}int client(){int i;for(i =0; i++; i< ARRAY_SIZE(shop)){printf("cap %d size %d", i, shop[i].size);}for(i =0; i++; i< ARRAY_SIZE(shop)){printf("cap %d price %d", i, shop[i].price);}}

对比两者的代码,可以明显看出,C实现里从来不在用于存放数据的结构体里放函数。也就是说,面向对象里数据的抽象父类提供的getsize子类的方法是不存在的。

如果想要访问数据,根据数据的组织形式,直接操作就可以。从这个意义上讲,如果C语言实现里想要增加访问方法,根本不用修改数据相关的东西,这个比向对象里还需要修改数据的父类更为纯粹。这个才是更干净的访问者模式,也可以换个角度说,C里面根本不存在访问者模式。

来源:华为云社区  作者:lurayvis

设计模式的C语言应用-访问者模式-第九章相关推荐

  1. 设计模式的C语言应用-状态机模式-第二章

    模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...

  2. 基于设计模式的学习之旅-----访问者模式(附源码)

    基于设计模式的学习之旅-----访问者模式 1.初始访问者模式 2.什么是访问者模式 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 3.模 ...

  3. Java设计模式之行为型:访问者模式

    背景: 去医院看病时,医生会给你一个处方单要你去拿药,拿药我们可以分为两步走: (1)去柜台交钱,划价人员会根据处方单上的药进行划价,交钱. (2)去药房拿药,药房工作者同样根据处方单给你相对应的药. ...

  4. 访问者模式的java语言_Java 设计模式系列(二三)访问者模式(Vistor)

    Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...

  5. 23种设计模式(二十三)访问者模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  6. 设计模式第19篇:访问者模式

    一.访问者模式介绍 定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作. 二.访问者模式代码用例 此处以购物车为例来说明,比如不同的商品有 ...

  7. java的visitor模式_java设计模式(二十一)访问者模式(Visitor)

    介绍 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式是一种对象行为型模式. 简单来 ...

  8. R循环有两个_R语言数据分析与挖掘(第九章):聚类分析(2)——层次聚类

    层次聚类(hierarchical clustering)基于簇间的相似度在不同层次上分析数据,从而形成树形的聚类结构,层次聚类一般有两种划分策略:自底向上的聚合(agglomerative)策略和自 ...

  9. 设计模式的C语言应用-命令模式-第五章

    模式介绍:命令模式(command) 命令模式的解释如下: 向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指定具体的请求接收者即可,对于这样将请求封 ...

最新文章

  1. 没有任何基础学编程从哪开始_没有任何的绘画基础,该怎么学绘画?
  2. 【收藏】Linux系统常用命令速查手册(附PDF下载链接)
  3. SQL_MODE设置
  4. WF(9):本地服务之事件处理
  5. html alert 的三种方式
  6. asr1009查看接口光衰_python脚本检查H3C交换机光衰
  7. Linux的/var/www/html目录
  8. CMS软件系统架构设计思考
  9. VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
  10. 图像处理求均方差得c语言实现,数字图像处理第10章课件.ppt
  11. 百战程序员python百度网盘_【百战程序员】Python 文件I/O
  12. 浅谈select2的使用
  13. html+css实现天猫官网
  14. linux系统中 为mysql还原数据库_linux中mysql还原数据库命令
  15. java版我的世界附魔指令_我的世界手机版附魔指令 怎么使用附魔指令大全
  16. 不想失业?你得学会为自己工作
  17. 一些很漂亮的字符图片
  18. Windows11 C盘清理-系统休眠文件占用15G
  19. 关于嵌入式软件开发的一些思考
  20. 机器视觉-相机标定及畸变矫正

热门文章

  1. python的属性访问,python:如何访问函数的属性
  2. 理想CEO李想在2020年的一些分享演讲
  3. Luogu P1197 [JSOI2008]星球大战
  4. d3.js(v5.7)树状图
  5. Linux 下编译、安装、配置 QT
  6. #if、#if defined 的使用
  7. 【剑指offer】35、复杂链表的复制
  8. Python爬虫(二十一)_Selenium与PhantomJS
  9. getHibernateTemplate()的find用法大全
  10. PHP函数调用的新的用法