锁定老帖子 主题:Visitor - 访问者模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-14
这个模式并不是可以随便乱用的,看上去这个模式很简单,但是如果情况比较固定,如例子里面所说的三种业务情形的话,直接判断也未尝不可。Visitor模式适合于情况复杂,且随时准备扩展的情况下,比如说有十几种业务需要展开,而且时不时会推出新的业务,这时候就可以利用这个模式方便快捷的添加业务实现类了,而且不会影响到之前实现的业务逻辑。
|
|
返回顶楼 | |
发表时间:2008-09-20
在Service的子类中必须重写accept()方法!呵呵~~~
|
|
返回顶楼 | |
发表时间:2008-10-04
真的很感谢楼主...又学到了.
|
|
返回顶楼 | |
发表时间:2008-10-04
引用 当然,Visitor也有它自身的限制。它不适合于业务数量的经常变化,因为一旦新增或删除一些Service时,需要对visitor进行相应的增删。也就是说具体Service与Visitor是耦合的。
有点没懂,,把service抽象成一个接口是否会比用继承好呢?而且不会有耦合。。。其实,我非常想知道关于visitor模式的定义,,有了准确定义,实现应该会比较简单。 注:我这儿的accept()、process()方法和lz的对应的方法是不一样的。。 public interface IVisitor { public void accept(IService service); } public interface IService { public void process(IVisitor vistor); } public class Fund implements IService { public void process(IVisitor vistor){ System.out.println("处理" + this); } public String toString(){ return "基金业务"; } } public class Saving implements IService { public void process(IVisitor vistor) { System.out.println("处理" + this); } public String toString() { return "存款业务"; } } public class Visitor implements IVisitor { public void accept(IService service) { service.process(this); } } public class VisitorClients0 { public static void main(String[] args) { IVisitor visitor = new Visitor(); IService fundService = new Fund(); IService savingService = new Saving(); visitor.accept(fundService); visitor.accept(savingService); } } |
|
返回顶楼 | |
发表时间:2008-10-07
wangdi 写道 引用 当然,Visitor也有它自身的限制。它不适合于业务数量的经常变化,因为一旦新增或删除一些Service时,需要对visitor进行相应的增删。也就是说具体Service与Visitor是耦合的。
有点没懂,,把service抽象成一个接口是否会比用继承好呢?而且不会有耦合。。。其实,我非常想知道关于visitor模式的定义,,有了准确定义,实现应该会比较简单。 注:我这儿的accept()、process()方法和lz的对应的方法是不一样的。。 public interface IVisitor { public void accept(IService service); } public interface IService { public void process(IVisitor vistor); } public class Fund implements IService { public void process(IVisitor vistor){ System.out.println("处理" + this); } public String toString(){ return "基金业务"; } } public class Saving implements IService { public void process(IVisitor vistor) { System.out.println("处理" + this); } public String toString() { return "存款业务"; } } public class Visitor implements IVisitor { public void accept(IService service) { service.process(this); } } public class VisitorClients0 { public static void main(String[] args) { IVisitor visitor = new Visitor(); IService fundService = new Fund(); IService savingService = new Saving(); visitor.accept(fundService); visitor.accept(savingService); } } 你的实现其实是策略模式,两者各有特点,各有长短 |
|
返回顶楼 | |
发表时间:2008-12-07
访问者模式主要是用于“调用多个算法,使用适用于不同的对象结构”。
但是该模式会使代码变得晦涩,出现循环访问的情况。 最近在看JSpider源码,其中,很多设计用来这个模式,谢谢楼主,学习了。 现更容易去仔细研究其源码。 刚开始时被JSpider中的该模式给扰得脑子一段乱 ,找不出真正实现者。感觉永远在自身调用自身。 |
|
返回顶楼 | |
发表时间:2008-12-08
最后修改:2008-12-08
我狂晕!
这就是观察者模式?这就是访问者模式? 把访问者模式的局部取出来,就说是访问者模式。还有人说是观察者模式。 要详细学习设计模式,建议到网上下载李建忠的设计模式讲义或视频。这可是当年msdn、csdn 花钱请的。 国家软件设计师资格考试2005年的答案,在该讲师的讲义中能找到。 楼主所举的,仅仅是一种模式,并不是传说中的二十三模式之一。他仅仅是访问者模式的局部,或者说是访问者模式中的特例。难 http://tech.163.com/05/0718/10/1OUFF2JQ00091589.html这里有访问者模式的uml图 下面是观察者模式定义。来源于李建忠讲师的设计模式。 ---------------------------------------------------- 在所软件构建过程中,需要为某些对象建立“一种依赖关系”—— 一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知,如果这种关系过于紧密,将使软件不能很好的抵御变化。 定义:定义对象间的一种“一对多的依赖关系”,以便当一个对象的状态发生改变时,有依赖它的对象都将得到通知并自动更新。 下面是访问者模式定义 ======================== 引:类层次结构中,可能经常引入新的操作,从而将类型变得脆弱。在软件构建过程中,由于需求的变化,某些类层次结构中,经常需要添加新的方法,如果直接在基类更改,将会给子类带来严重的负担,甚至破坏原有设计。 定义:表示一个作用于某对象结构中的各元素的操作。它可以在不改变各个元素类的前提下,定义于作用这些元素的新操作。 |
|
返回顶楼 | |
发表时间:2008-12-08
最后修改:2008-12-08
http://tech.ddvip.com/2008-11/122584688388977.html
这是豆豆网上的观察者模式介绍。 楼主,所例举的,仅能辅助理解,并不全面。在重大考试中,会丢分。 建议楼主,在文中给出权威网站上的设计模式教材的网址。 |
|
返回顶楼 | |
发表时间:2008-12-08
最后修改:2008-12-08
我再次狂晕,三年没看设计模式了。居然连策略模式都没印象了!
这里是教材网址:http://tech.ddvip.com/2008-11/122584658688974.html 这里出自李建忠的讲义: ========================== 引:在软件构建过程中,某些算法可能多种多样,经常改变,如果将 这些算法都编码在对象中,将会使得对象变得非常复杂,而且有时支持不使用的算法也是一个负担。 意图:定义一系列算法,把它们一个个封装起来,并且使他们可以互相替换。该模式使得算法可以独立于使用它的客户而变化。 ---------------------------------------- |
|
返回顶楼 | |
发表时间:2008-12-08
最后修改:2008-12-08
哎!网上搜了一下,大部份都是这种答案。可惜啊,没把访问者的这一点所用上: 在不改变原有类与类的继承体系结构上,为原类继承体系增加新的方法。楼主恰恰只把访问者中的特例说到了(不增加新功能)。 |
|
返回顶楼 | |