动机:在软件构建过程中,由于需求的变化,某些类层次结构(父类、子类)中添加新的行为。如果直接在基类中更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改原有类的情况下,透明地为类层次结构添加新行为。
定义:表示一个作用于某对象结构中的各元素的操作,使得可以在不改变各个元素的类的前提下扩展这些元素的新操作。
结构图:
总结:visitor模式通过双重分发,来实现在不更改element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态地添加新的操作。
在写代码是就要预想到,以后可能会添加新行为,但是添加哪些行为、添加几个行为是不知道的。要提前做好伏笔。
二次多态辨析:第一个为accept方法的多态辨析,第二个为visitElementX方法的多态辨析。
缺点: 元素的子类个数要确定,因为子类的个数对应着visitor每个子类的方法的个数,如果元素的子类要增加,那么所有visitor的子类的方法个数都要添加。之所以要添加,是因为每个visitor表示一种行为,而每个visitor中的方法对应着一个特定子类元素的行为。所以visitor中的方法参数就是元素子类。
visitor模式使用与Element类层次结构稳定,而操作需要面临频繁改动。
参考:https://www.bilibili.com/video/av24176315/?p=24