《设计模式之禅》之访问者模式
一、访问者模式的定义访问者模式是一个相对简单的模式,其定义如下: 角色职责Visitor–抽象访问者抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问的。 ConcreteVisitor–具体访问者它影响访问者访问到一个类中该怎么干,要做什么事情。 Element–抽象元素接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。 ConcreteElement–具体元素实现accept方法,通常是visitor.visit(this),基本上都形成了一种模式。 ObjectStruture–结构对象元素产生者,一般容纳在多个不同类、不同接口的容器,如List、Set、Map等,在项目中,一般很少抽象出这个角色。 换言之,大家可以这样理解访问者模式: 二、访问者模式的应用1.访问者模式的优点(1)符合单一职责原则具体元素角色也就是Employee抽象类的两个子类负责数据的加载,而Visitor类则负责报表的展现,两个不同的职责非常明确地分离开来,各自演绎变化。 (2)优秀的扩展性由于职责分开,继续增加对数据的操作是非常快捷的,例如,现在要增加一份给大老板的报表这份报表格式又有所不同,直接在Visitor中增加一个方法,传递数据后进行整理打印。 (3)灵活性非常高例如,数据汇总。 2.访问者模式的缺点(1)具体元素对访问者公布细节访问者要访问一个类就必然要求这个类公布一些方法和数据,也就是访问者关注了其他类的内部细节,这就是迪米特法则所不建议的。 (2)具体元素变更比较困难具体元素角色的增加、删除、修改都是比较困难的,就上面那个例子,你想想,你要是想增加一个成员变量,如年龄age,Visitor就需要修改,如果Visitor是一个还好办,多个呢?业务逻辑再复杂点呢? (3)违背了依赖倒置原则访问者依赖的是具体元素,而不是抽象元素,这破坏了依赖倒置原则,特别是面向对象的编程中,抛弃了对接口的依赖,而直接依赖实现类,扩展比较难。 3.访问者模式的使用场景
四、访问者模式的扩展1.统计功能(汇总和报表)2.多个访问者3.双分派五、最佳实践访问者模式是一种集中规整模式,特别适用于大规模重构的项目,在这一个阶段需求已经非常清晰,原系统的功能点也已经明确,通过访问者模式可以很容易把一些功能进行梳理,达到最终目的–功能集中化,如一个统一的报表运算、UI展现等,我们还可以与其他模式混编建立一套自己的过滤器或者拦截器。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |