论坛首页 Java企业应用论坛

Visitor - 访问者模式

浏览 13015 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-09-14  
这个模式并不是可以随便乱用的,看上去这个模式很简单,但是如果情况比较固定,如例子里面所说的三种业务情形的话,直接判断也未尝不可。Visitor模式适合于情况复杂,且随时准备扩展的情况下,比如说有十几种业务需要展开,而且时不时会推出新的业务,这时候就可以利用这个模式方便快捷的添加业务实现类了,而且不会影响到之前实现的业务逻辑。
0 请登录后投票
   发表时间:2008-09-20  
在Service的子类中必须重写accept()方法!呵呵~~~
0 请登录后投票
   发表时间:2008-10-04  
真的很感谢楼主...又学到了.
0 请登录后投票
   发表时间: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);
    }
}
0 请登录后投票
   发表时间: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);
    }
}


你的实现其实是策略模式,两者各有特点,各有长短
0 请登录后投票
   发表时间:2008-12-07  
访问者模式主要是用于“调用多个算法,使用适用于不同的对象结构”。
但是该模式会使代码变得晦涩,出现循环访问的情况。
最近在看JSpider源码,其中,很多设计用来这个模式,谢谢楼主,学习了。
现更容易去仔细研究其源码。
刚开始时被JSpider中的该模式给扰得脑子一段乱 ,找不出真正实现者。感觉永远在自身调用自身。
0 请登录后投票
   发表时间:2008-12-08   最后修改:2008-12-08
我狂晕!

这就是观察者模式?这就是访问者模式?

把访问者模式的局部取出来,就说是访问者模式。还有人说是观察者模式。



要详细学习设计模式,建议到网上下载李建忠的设计模式讲义或视频。这可是当年msdn、csdn 花钱请的。
国家软件设计师资格考试2005年的答案,在该讲师的讲义中能找到。



楼主所举的,仅仅是一种模式,并不是传说中的二十三模式之一。他仅仅是访问者模式的局部,或者说是访问者模式中的特例。难

http://tech.163.com/05/0718/10/1OUFF2JQ00091589.html这里有访问者模式的uml图

下面是观察者模式定义。来源于李建忠讲师的设计模式。
----------------------------------------------------
    在所软件构建过程中,需要为某些对象建立“一种依赖关系”—— 一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知,如果这种关系过于紧密,将使软件不能很好的抵御变化。
    定义:定义对象间的一种“一对多的依赖关系”,以便当一个对象的状态发生改变时,有依赖它的对象都将得到通知并自动更新。

下面是访问者模式定义
========================
  引:类层次结构中,可能经常引入新的操作,从而将类型变得脆弱。在软件构建过程中,由于需求的变化,某些类层次结构中,经常需要添加新的方法,如果直接在基类更改,将会给子类带来严重的负担,甚至破坏原有设计。
    定义:表示一个作用于某对象结构中的各元素的操作。它可以在不改变各个元素类的前提下,定义于作用这些元素的新操作。

0 请登录后投票
   发表时间:2008-12-08   最后修改:2008-12-08
http://tech.ddvip.com/2008-11/122584688388977.html

这是豆豆网上的观察者模式介绍。

楼主,所例举的,仅能辅助理解,并不全面。在重大考试中,会丢分。

建议楼主,在文中给出权威网站上的设计模式教材的网址。

0 请登录后投票
   发表时间:2008-12-08   最后修改:2008-12-08
我再次狂晕,三年没看设计模式了。居然连策略模式都没印象了!

这里是教材网址:http://tech.ddvip.com/2008-11/122584658688974.html




这里出自李建忠的讲义:
==========================

引:在软件构建过程中,某些算法可能多种多样,经常改变,如果将 这些算法都编码在对象中,将会使得对象变得非常复杂,而且有时支持不使用的算法也是一个负担。
    意图:定义一系列算法,把它们一个个封装起来,并且使他们可以互相替换。该模式使得算法可以独立于使用它的客户而变化。
----------------------------------------




0 请登录后投票
   发表时间:2008-12-08   最后修改:2008-12-08


哎!网上搜了一下,大部份都是这种答案。可惜啊,没把访问者的这一点所用上: 在不改变原有类与类的继承体系结构上,为原类继承体系增加新的方法。楼主恰恰只把访问者中的特例说到了(不增加新功能)。


0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics