设计模式访问者模式.pptxVIP

  • 2
  • 0
  • 约1.6千字
  • 约 16页
  • 2018-07-18 发布于湖北
  • 举报
访问者模式 产生原因 模式定义与结构 实例分析 优缺点 总结 问题提出 如果某系统已经完成了一个类层次并提供了满足需求的所有接口,现在要增加新的需求,我们需要怎么做? 可能你会采用增加该需求并把整个层次结构统统修改一遍? 然而如果需求变动会不停的发生,而且需求的任何变动都会让整个结构统统修改一遍,此时你会怎么做呢? 所以,我们现在需要对这个系统结构进行重构,访问者模式也许就是你解决上面问题最好的选择. 那么什么是访问者模式呢? 访问者模式 模式定义 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式。 顾名思义 使用这个模式后就可以在不修改已有程序结构的前提下,通过添加额外的“访问者”完成对已有代码功能的提升。 注意:不同的访问者其访问方式有所不同 访问者模式 访问者模式——模式结构 访问者模式包含如下角色: Vistor: 抽象访问者 ConcreteVisitor: 具体访问者 Element: 抽象元素 ConcreteElement:具体元素 ObjectStructure:对象结构 访问者模式——实例 购物车 顾客在超市中将选择的商品,如苹果、图书等放在购物车中,然后到收银员处付款。在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品。此时,购物车作为一个ObjectStructure(对象结构)用于存储各种类型的商品,而顾客和收银员作为访问这些商品的访问者,他们需要对商品进行检查和计价。不同类型的商品其访问形式也可能不同,如苹果需要过秤之后再计价,而图书不需要。使用访问者模式来设计该购物过程。 购物车 代码-元素 代码-访问者 代码-对象结构 代码-主函数实现 访问者模式——优点 提出问题: 现在遇到一个问题:要向原来的购物车类层次增加一个新的操作——工商局的检查超市产品的生产日期,怎么解决呢? 解决方法: 仅仅需要添加一个具体的访问者角色即可,而不必修改整个类层次,这样就符合“开闭原则”的需求。 而且每个访问者角色都对应一个相关的操作,当需要修改一个具体的访问者角色时仅仅修改该访问者角色,而不是修改整个类层次. 综上问题访问者模式的优点为: 1.增加新的访问操作变得容易; 2.将有关元素对象的访问行为集中到一个访问者对象中,而不是分散到各个元素类中; 3.用户能在不修改类层次结构情况下定义该类层次结构的操作并修改. 购物车——增加新操作”工商局” 访问者模式——缺点 提出问题: 现在遇到一个问题:要向原来的购物车类层次增加一个新的元素“Pen”,或者“Book”元素需要改变,怎么解决呢? 解决方法: 你必须要修改访问者角色和每一个具体访问者角色,对应的访问者每一个函数的参数都要相应的变化. 缺点一:访问者模式增加新的元素很困难,每增加一个新的元素或修改一个元素,就要对相应的访问者类进行修改,违背了“开闭原则”。 而且访问者角色要执行与角色相关的操作,就必须让元素的内部属性暴露出来,在java中就意味着对象可以访问,这就破坏了元素的封装性。 缺点二:破坏封装性。 缺点三:而且访问者之间能够传递的信息有限,这就往往会限制访问者模式的使用。 购物车——修改”Book” 总结 这是一个巧妙而又复杂的模式,它的使用条件 比较苛刻. 当系统存在固定的数据结构(类层次),又有不同的行为,那么访问者模式是个不错的选择. 如果需要修改或增加元素时,就不应该使用访问者模式. 访问者模式要尽可能的将对象浏览逻辑存放在Visitor类中,而不是放在它的子类中;这样ConcreteVisitor类所访问的对象结构依赖较少,便于维护。

文档评论(0)

1亿VIP精品文档

相关文档