背景
最后一个设计模式,也是《大话设计模式》公认最难的设计模式,当然不是理解上困难,我觉得应该是使用上困难,这个设计模式虽然具有非常良好的扩展能力,但却需要类的结构早早定义清晰,试想,需求时刻变化,你的类可以稳定吗?
1、使用意图
容易扩展,满足开发封闭原则
2、生活实例
男人和女人的状态,把ConcreteElmentA看成男人,把ConcreteElementB看成女人,那么,所有的Visitor实例就是成功状态、失败状态、结婚状态、升职状态等。把这些状态放在客户端的集合中维护,一旦需要,就遍历集合,ConcreteElmentA中接收状态,然后只调用VisitConcreteElementA的方法,因为只有这个属于他的状态,同理,ConcreteElmentB中接收状态,然后只调用VisitConcreteElementB的方法;当我们需要扩展一种状态时,比如离婚状态,你们只要新增一个Visitor就能达到目的,不需要修改任何类,这就是扩展方便。
3、Java 例子(框架、JDK 、JEE)
暂时没有发现,如果又发现的同学可以补充修改
4、模式类图
- 抽象访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具休访问者的具休元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
- 具体访问者角色(ConcreteVisitor):实现Visitor声明的接口。
- 元素(Element): 定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数。
- 具体元素(ConcreteElement):实现了抽象元素(Element)所定义的接受操作接口。
- 结构对象角色ObjectStructure ): 这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
5、模式优点
访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。
访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。
其优点就是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。
其缺点就是增加新的数据结构很困难。
6、与类似模式比较
感觉没什么好比较的,也不知道这个设计模式我会用在哪里。
时间: 2024-10-13 08:54:32