设计模式(22) - 访问者模式

  问题描述

集合的节点元素类型相对稳定,但是,在遍历集合各个节点元素的时候,针对不同类型节点元素的访问操作各不相同;并且将来更可能会添加新的访问操作。如果把这些访问操作实现成节点元素的方法,那么这种访问方法就成为节点类型的一个变化点。如何避免对节点元素的修改而又支持新的节点方法呢?访问者模式!

访问者模式

如图所示,由于系统中元素节点类型相对稳定(例如ConcreteElementA & ConcreteElementB),Visitor类型定义了访问每个节点元素的方法(即VisitConcreteElementA() & VisitConcreteElementB()),这个Visitor接口定义会保持相对稳定。Element类型定义了一个抽象接口VisitMe(Visitior* v);节点元素ConcreteElementA和ConcreteElementB实现VisitMe()接口非常简单:以this指针作为参数调用Visitor定义的访问自己接口。显然,当系统需要提供不同的访问Element方法的时候,只要继承Visitor接口并实现相应的访问方法即可;这个过程对于Element节点元素保持透明。


讨论

系统在遍历节点元素的过程中,为不同的节点元素提供不同的访问方法;创建新的Visitor具体类可以方便的定义节点元素的新的访问方法而不影响Element的设计,这就是访问者模式为程序提供的一种封装变化点的方法。访问者模式隔离了元素和元素的访问方法。客户通过一个Visitor对象就可以遍历集合中不同的节点类型并自动调度节点相关的访问方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值