MyException - 我的异常网
当前位置:我的异常网» 编程 » 《JAVA与形式》之访问者模式

《JAVA与形式》之访问者模式

www.MyException.Cn  网友分享于:2014-11-15  浏览:0次
《JAVA与模式》之访问者模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述访问者(Visitor)模式的:

  访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

复制代码
 1 interface Service {
 2 
 3     public void accept(Visitor visitor);
 4 }
 5 
 6 class Visitor {
 7 
 8     public void process(Service service) {
 9         // 基本业务
10         System.out.println("基本业务");
11     }
12 
13     public void process(Saving service) {
14         // 存款
15         System.out.println("存款");
16     }
17 
18     public void process(Draw service) {
19         // 提款
20         System.out.println("提款");
21     }
22 
23     public void process(Fund service) {
24         System.out.println("基金");
25         // 基金
26     }
27 
28 }
29 
30 class Saving implements Service {
31 
32     public void accept(Visitor visitor) {
33         visitor.process(this);
34 
35     }
36 }
37 
38 class Draw implements Service {
39 
40     public void accept(Visitor visitor) {
41         visitor.process(this);
42 
43     }
44 }
45 
46 class Fund implements Service {
47 
48     public void accept(Visitor visitor) {
49         visitor.process(this);
50 
51     }
52 }
复制代码

从上面例子可以看出,访问者借助的是java的动态分配机制,使得visitor可以顺利的执行相应对象的方法

复制代码
 1 // 正常逻辑实现
 2 
 3         Service service1 = new Saving();
 4         Service service2 = new Fund();
 5         Service service3 = new Draw();
 6         List<Service> ls = new ArrayList<Service>();
 7         ls.add(service1);
 8         ls.add(service2);
 9         ls.add(service3);
10         for (Service service : ls) {
11             if (service instanceof Saving) {
12                 System.out.println("存款");
13             } else if (service instanceof Fund) {
14                 System.out.println("基金");
15             } else if (service instanceof Draw) {
16                 System.out.println("提款");
17             }
18         }
19         //上述的问题是随着业务量增大 代码维护量会非常的大 需要不断的去判断 
20         
21         //采用访问者模式解决
22         Service saving = new Saving();
23         Service fund = new Fund();
24         Service draw = new Draw();
25         Visitor visitor = new Visitor();
26         saving.accept(visitor);
27         fund.accept(visitor);
28         draw.accept(visitor);
29         //上述中accept中实际上有观察者的影子 实际上 访问者我们也可以理解成一个对业务熟悉的观察者
30         //他不断观察者是否有新的业务需求 有的话 进行相应的业务处理
复制代码

小结:

采用Visitor的好处如上面说到的那样,当需要改变其中一项业务的处理时,不需要每个地方都进行修改,而只需要改动Visitor类中相应的处理函数就可以了。也就是说它适合于业务处理时常发生变动的情况。 

当然,Visitor也有它自身的限制。它不适合于业务数量的经常变化,因为一旦新增或删除一些Service时,需要对visitor进行相应的增删。也就是说具体Service与Visitor是耦合的

其实也是将责任抽象成一个个具体的类,从而避免在一个类中既处理逻辑又带有功能,违反了面向对象原则--责任单一

参考:

http://men4661273.iteye.com/blog/1635167

http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html

文章评论

“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
总结2014中国互联网十大段子
总结2014中国互联网十大段子
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
旅行,写作,编程
旅行,写作,编程
程序员必看的十大电影
程序员必看的十大电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的鄙视链
程序员的鄙视链
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
一个程序员的时间管理
一个程序员的时间管理
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
老程序员的下场
老程序员的下场
程序员都该阅读的书
程序员都该阅读的书
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
编程语言是女人
编程语言是女人
漫画:程序员的工作
漫画:程序员的工作
鲜为人知的编程真相
鲜为人知的编程真相
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
那些争议最大的编程观点
那些争议最大的编程观点
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
每天工作4小时的程序员
每天工作4小时的程序员
我是如何打败拖延症的
我是如何打败拖延症的
10个调试和排错的小建议
10个调试和排错的小建议
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员应该关注的一些事儿
程序员应该关注的一些事儿
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java程序员必看电影
Java程序员必看电影
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
 程序员的样子
程序员的样子
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
代码女神横空出世
代码女神横空出世
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有