首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

一步一步地质解Visitor模式

2012-09-13 
一步一步地理解Visitor模式现在能找到的Visitor模式的讲解大都非常跳跃,问题列出来出后,讲着讲着就突然给

一步一步地理解Visitor模式
现在能找到的Visitor模式的讲解大都非常跳跃,问题列出来出后,讲着讲着就突然给出了生涩的UML类图和accept()、visit()等奇怪的方法名,让人非常费解; 读者即使理解了,也有囫囵吞枣的感觉,不能领会其精妙之处。

本文试图以问题为驱动,以代码重构的方式,展示我们是怎么样一步一步地解决问题,并选择visitor模式作为重构的终点。


#1.问题域


  visitor模式用于遍历一群对象,这些对象按某种结构组织在一起(List, Set, Tree等)。这种场景常常面临的问题是:
   组织里的对象的类型彼此不同,遍历者要根据不同的类型使用不同的逻辑,导致代码里频繁使用if语句,可读性、可维护性都会比较差



    代码详见https://github.com/chenjianjx/learn-visitor-pattern/blob/master/1st-PlainSolution/src/learn/visitor/research/client/EmployeeClient.java

  要消除if,最常见的方式就是把各个if里面的逻辑塞入到对象的各个子类中


#2.通过多态解决对象类型不同的问题




    private static void drink(Team team) throws Exception {        DrinkVisitor visitor = new DrinkVisitor();        for (Employee employee : team.getEmployees()) {            employee.accept(visitor);        }          }    private static void printTitle(Team team) throws Exception {        PrintTitleVisitor visitor = new PrintTitleVisitor();        for (Employee employee : team.getEmployees()) {            employee.accept(visitor);        }    }


    代码详见https://github.com/chenjianjx/learn-visitor-pattern/blob/master/5th-VisitorStyle/src/learn/visitor/research/client/EmployeeClient.java

热点排行