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

1.访问者模式介绍

        访问者模式时十一大行为型设计模式之一。

        访问者模式是一种将数据操作与数据结构分离的操作模式,它是23种设计模式中最复杂的一个,但使用频率并不高,但是一旦需要使用它时,那就是真地需要它了。

        访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的,比较稳定的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象的访问。访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素做出不同的处理。在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方法中会调用访问者的visit方法,从而使访问者得以处理对象结构的每一个元素,我们可以针对对象结构设计不同访问者类来完成不同的操作,达到区别对待的效果。

2.访问者模式的定义

        封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。

3.访问者模式的使用场景

        1.对象结构比较稳定,但经常需要在此对象结构上定义新的操作。

        2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。

4.UML类图

Android设计模式——访问者模式_第1张图片

5.角色介绍

Visitor:接口或者抽象类,它定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素个数是一样的,因此,访问者模式要求元素的类族要稳定,如果经常添加,移除元素类,必然会导致频繁地修改Visitor接口,如果出现这种情况,则说明不适合使用访问者模式。

ConcreteVisitor:具体的访问者,它需要给出对每一个元素类访问时所产生的具体行为。

Element:元素接口或者抽象类,它提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。

ObjectStructure:定义当中所提到的对象结构,对象结构是一个抽象表述,它内部管理了元素集合,并且可以迭代这些元素供访问者访问。

6.例子

Android设计模式——访问者模式_第2张图片
Staff员工类,元素接口或者抽象类(上图)
Android设计模式——访问者模式_第3张图片
工程师,具体的元素类(上图)
Android设计模式——访问者模式_第4张图片
经理,具体的元素类(上图)
Android设计模式——访问者模式_第5张图片
Visitor,接口或抽象类(上图)
Android设计模式——访问者模式_第6张图片
CEO,具体的访问者(上图)
Android设计模式——访问者模式_第7张图片
CTO,具体的访问者(上图)
Android设计模式——访问者模式_第8张图片
报表,ObjectStructure即对象结构(上图)
Android设计模式——访问者模式_第9张图片
客户端调用(上图)

例子分析

        Staff扮演了Element角色,而Engineer和Manager都是ConcreteElement;CEOVisitor和CTOVisitor都是具体的Visitor对象;而BusinessReport就是ObjectStructure;Client就是客户端代码。访问者模式最大的优点就是增加访问者非常容易,如果要增加一个访问者,新建一个实现了Visitor接口的类,然后实现两个visit函数来对不同的元素进行不同的操作,从而达到数据对象与数据结构相分离的次奥过。如果不使用访问者模式,而又想对不同的元素进行不同的操作,那么必定需要使用if-else和类型转换,这使得代码难以升级维护。

7.Android源码中的访问者模式

        编译注解的核心原理依赖APT(Annotation Processing Tools)实现,例如ButterKnife,Dagger,Retrofit等开源库都是基于APT。编译注解就有典型的访问者模式。

8.总结

        优点:各角色职责分离,符合单一职责原则。具有优秀的扩展性。使得数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化。灵活性。

        缺点:具体元素对访问者公布细节,违反了迪米特原则。具体元素变更时导致修改成本大。违反了依赖倒置原则,为了达到“区别对待”而依赖了具体类,没有依赖抽象。

PS:读《Android源码设计模式解析与实战》中的访问者模式之后的一些笔记与感悟。

你可能感兴趣的:(Android设计模式——访问者模式)