java设计模式之访问者模式

java设计模式之访问者模式_第1张图片

访问者模式

访问者(Visitor

Pattern)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。

java设计模式之访问者模式_第2张图片

访问者解决的问题

稳定的数据结构和易变的操作耦合问题

访问者模式角色

抽象访问者(Visitor)角色:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。

具体访问者(ConcreteVisitor)角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。

抽象元素(Element)角色:声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。

具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。

对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由 List、Set、Map 等聚合类实现。

java设计模式之访问者模式_第3张图片

使用场景

电影或电视剧中的人物角色,不同的观众对他们的评价也不同;

顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员关心的是商品的价格和数量。

java设计模式之访问者模式_第4张图片

代码实现

java设计模式之访问者模式_第5张图片
java设计模式之访问者模式_第6张图片
java设计模式之访问者模式_第7张图片
java设计模式之访问者模式_第8张图片
java设计模式之访问者模式_第9张图片
java设计模式之访问者模式_第10张图片
java设计模式之访问者模式_第11张图片

运行结果:

java设计模式之访问者模式_第12张图片

优缺点

优点:

扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。

复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。

灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构。

符合单一职责原则。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。

缺点:

破坏封装。访问者模式中具体元素对访问者公布细节,这破坏了对象的封装性。

增加新的元素类很困难。在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。

生活中的访问者模式

系统访问,同一套系统,有很多功能不同的人访问到的结果不一样,运营人员,只拥有运营相关的权限,销售只拥有有关销售相关的功能权限,财务只拥有财务相关的功能权限,Boss拥有所有的权限。资源是一样的,只是根据不同的访问者,展现不同的内容。

交警经常会接受路人的问路,中国人问路的时候,交警用汉语告诉路人他目的地的路线。如果访问者是一个外国友人,交警同志需要用英语告诉他路线图。

心理辅导师,给用户做心理辅导的时候,需要根据用户的不同年龄、不同文化程度、不同的心理障碍程度,使用不同的方法对其进行治疗。

我的启发

访问者模式,可谓是“见人说人话,见鬼说鬼话”,被访者需要根据访问者的实际情况,做出相应的动作。就像吴军老师《态度》中的观点,要以对方听得懂的话来沟通。每个人都扮演不同的角色,不同角色被访问时,要做好切换,不要把工作中的角色带回家,也不要把家中的角色带到工作中来。

设计模式系列文章历史

java设计模式之原型模式,本故事纯属虚构,如有雷同,纯属巧合

java设计模式之桥接模式,策略模式旗舰版,世界没有免费的午餐

java设计模式之代理模式,看我72变

java设计模式之构建模式,私人订制自己的创意

java设计模式之状态模式,策略模式的孪生兄弟

java设计模式之迭代器模式,顾客永远的上帝

java设计模式之模板模式,站在巨人的肩膀上成功

java设计模式之适配器模式,大丈夫能屈能伸

Head First 设计模式之命令模式,各司其职提高效率

Head First 设计模式之装饰器模式,因为参与,所以认同

Head First 设计模式之单例模式,每个人都是唯一

Head First 设计模式之观察者模式,你我都是发布者和订阅者

Head first 设计模式之策略模式,来源于生活,用之于生活

java经典书单:

15年经验的老兵推荐书单,高手是这样炼成的,你读了几本?

java设计模式之访问者模式_第13张图片

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