访问者模式


访问者模式

  • 访问者模式:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
  • 先来举个例子吧,一个公司有各个层面的员工,有码农、技术主管、销售主管、总经理等等,这些员工都有个人基本信息(姓名、性别)、薪金、工作职责或业绩,那么如何以报表的形式展示这些信息呢,如下是两个类图:

访问者模式的优缺点
  • 访问者模式的优点
    • 符合单一职责原则:具体元素角色也就是Employee抽象类的两个子类负责数据加载,而Visitor类负责报表的呈现,两个不同的职责非常明确的分离开来,各自演绎变化;
    • 优秀的扩展性:由于职责分开,继续增加对数据的操作是非常快捷的,例如,想要生成一份不同格式的报表,直接在Visitor中增加一个方法;
    • 灵活性非常高:当数据汇总时,如果要统计所有员工的工资,而且不同类型的员工工资系数不同,则可以通过访问者模式实现。
  • 访问者模式的缺点
    • 具体元素对访问者公布细节:访问者要访问一个类就必然要求这个类公布一些方法和数据,也就是访问者关注了其他类的内部细节,这是迪米特法则所不建议的;
    • 具体元素变更比较困难,具体元素角色的增加、删除、修改都是比较困难的,如上例中增加一个年龄字段,则Visitor就需要修改,如果有多个Visitor那么会改动很大;
    • 违背了依赖倒置原则:访问者依赖的是具体元素,而不是抽象元素,这违背了依赖倒置原则,特别是在面向对象的编程中,抛弃对接口的依赖,而直接依赖实现类,扩展比较困难。
访问者模式的应用场景
  • 一个对象结构包含很多类对象,他们有不同的接口,想对这些对象实施一些依赖于其具体类的操作,也就是用迭代器模式已经不能胜任的场景。
  • 需要对一个对象结构中的对象进行很多不同并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。
posted @ 2016-11-28 09:44  best.lei  阅读(970)  评论(0编辑  收藏  举报