`

让我再罗嗦一下Visitor模式

阅读更多

        昨天看了idior兄的Visitor模式全解之后,思考了很久,同时自己也摸索着写了些代码,对Vistor模式有了进一步的理解。
        1、使用Vistor模式最大的好处就是增加对数据对象的操作却不需要改变数据对象本身,不需要对数据对象进行重新编译。在这里的数据对象以及所增加的操作都应该满足一定的条件的,如果你所操作的数据对象仅仅是一个或者所增加的操作仅仅作用一个数据对象集合中的极少数元素的话,那么使用Vistor难免就大材小用了。Visitor最适合使用的情况是:在一个拥有多个对象的多个实例集合中增加新操作;对象集合中的对象之间的联系是密切的,同时增加的新操作应该覆盖了对象集合中全部或者绝大部分元素。以下是我之前做的项目中一个例子:

public abstract class Ticket {
    
protected Date issueDate;
    
protected Double penalty;
    
protected String ticketNo; 
    
// getter and setter method
    public abstract void accept(Vistor v);        

}


public class FppTicket extends Ticket{
    
private String block;
    
private String building;
    
private String street;
    
// getter and setter methods
    public abstract void accpet(Vistor v) {
        v.visit(
this);
    }

}


public class FpmTicket extends Ticket{
   
private String offenceType;
   
// getter and setter methods
   public abstract void accpet(Vistor v) {
       v.visit(
this);
   }

}
 

FppTicket和FpmTicket是指违规停车和违规行车的罚单。对于两种不同的ticket,我们会做很多方面的统计,如统计某一天有多少罚单,罚款总数是多少等,在这种情况下,使用Vistor模式是相当适合的。于是就会出现PenaltyVistor,IssueDateVistor等等的Vistor:

public abstract class Vistor {
    
public abstract void visit(FpmTicket ticket);
    
public abstract void visit(FppTicket ticket);
}


public class PenaltyVistor extends Vistor{
    
public void visit(FpmTicket ticket) {}
    
public void visit(FppTicket ticket) {}
}

        2、对于数据对象本身,提供accept这个方法的根本目的在于将对象实例传递给其他对象(Vistor),因此你会发现所有accept方法的样子是一致的:

public void accept(Vistor v) {
    v.visit(
this);
}

从语义上讲确实是数据结构对象accept了Vistor的visit,但是这样的accept是抽象的,因为对于数据对象本身不知道Vistor是远方朋友还是不速之客。反观Vistor的visit方法,则会存在以不同类型的数据对象为参数的形式,因而在visit方法调用过程中获得数据对象的实例,接下来就可以对不同的数据对象采取不同的操作了。这就是idior震宇兄都反复强调的Visitor模式最重要的一点:double-dispatch(双重分派)。
        3、作为父类的Visitor应该为虚类或者接口,同时在Visitor类中定义了访问数据对象集合中所有元素的虚方法,强迫子类实现。这一点是比较正统的Visitor pattern的实现方式,也是大家诟病最多的地方。正是以这样的方式去组织各个Vistor之间的关系,就造成了往数据对象集合中增加新对象的时候,需要进行大量的改动。idior和震宇兄花了很多精力去减少由增加新对象而带来的改动,最后也有了相当不错的解决办法。但是,我觉得这样做反而没有体现出Vistor模式的特点了。大家可以再回头看一下我总结的第一点,增加的操作应该是作用于数据对象集合的全部或者绝大部分,因此增加了一个新的数据对象,对于Vistor以及由其派生的各个子Visitor都有必要增加访问这个新的数据对象的visit方法。我们可以这样认为,一个Visitor必须对它所visit的数据对象集合中每一个对象有所了解,而不应该一无所知
        4、Visitor的关注点应该是数据对象的共性,而非个性。因此,我们不应该去定义FppTicketVistor或者FpmTicketVistor这样的Visitor,而PenaltyVistor才符合Vistor模式的语义。然后我们在PenaltyVistor中增加针对不同类型的数据对象的visit方法,这样在Visitor层面上保持了数据对象的一致性(FppTicket和FpmTicket都继承了Ticket),在Visitor内部则体现出数据对象的差异性。
        好了,相应的思考就总结到这里,还请各位多多批评指教了。最后我还想多说一句对模式的肤浅认识:模式的应用就是为了让程序员能够更好的进行协作,为了让代码的组织更加有序,只有这样才能降低软件开发以及维护的成本,从而扩大软件的规模。尽量减少业务逻辑的变更所带来了的代码改动是应用设计模式的目的,同时更好的应对代码改动同样也是设计模式的目的啊。

分享到:
评论

相关推荐

    设计模式C++学习之访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...

    C++ Visitor模式

    **C++ Visitor模式详解** Visitor模式是设计模式中的一种行为模式,它在对象结构中引入了一个访问者角色,使得访问者能够对结构中的每个元素进行操作,而不改变元素本身的行为。这种模式允许我们在不修改已有类的...

    基于visitor模式和访问者模式的表达式树_求值引擎

    本项目基于“visitor模式”和“访问者模式”,实现了用于计算表达式的求值引擎,这涉及到一种将数学表达式转化为数据结构(表达式树)的方法,然后通过遍历该树来执行计算。下面我们将详细探讨这些概念。 1. **...

    试试visitor设计模式

    也许最开始出现这种模式,是因为另外的原因: 我有一堆数据放在一个库里头,不想让其它人拿着, 如果你要用数据干活,那你就把函数指针给我,我来替你使用这个数据。...然后人们就说,这是visitor模式。

    Visitor模式

    访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下,为对象添加新的操作。这种模式在处理具有复杂逻辑和多种类型的对象结构时特别有用,因为它允许你在不改变原有结构的情况下,...

    设计模式系列之visitor

    "设计模式系列之visitor"是一个关于软件设计模式的讨论,特别是关注于“访问者”(Visitor)模式。这个模式是GOF(Gamma, Helm, Johnson, Vlissides)在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出...

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    ### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...

    设计模式之访问者模式(Visitor)

    **访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...

    访问者模式VisitorPattern

    **访问者模式(VisitorPattern)** 访问者模式是一种行为设计模式,它使你能在不修改对象结构的前提下向对象添加新的操作。这种模式常用于处理具有复杂逻辑的对象结构,特别是当你需要对这些对象进行多态操作时。访问...

    C#设计模式之Visitor

    **C#设计模式之Visitor** **一、设计模式概述** 设计模式是软件开发中的经验总结,它提供了解决常见问题的可复用解决方案。在C#编程中,设计模式可以帮助我们编写更灵活、可扩展和易于维护的代码。"Visitor"(访问...

    (行为型模式) Visitor 访问者模式

    C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载

    设计模式之访问者模式(Visitor Pattern)

    **访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...

    设计模式-访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式的核心思想是分离了算法和对象结构,使得算法可以在不改变对象结构的情况下独立变化。 访问者...

    设计模式-访问者(Visitor)模式详解和应用.pdf

    ### 设计模式-访问者(Visitor)模式详解和应用 #### 一、访问者模式简介 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许我们向一组已存在的类添加新的行为,而无需修改这些类。这种模式的核心思想是在...

    Visitor

    "Visitor" 在IT行业中可能指的是一个设计模式,即“访问者模式”。访问者模式是一种行为设计模式,它允许我们定义一种在多种不同对象结构中访问、改变或增加新行为的操作方式,而无需改变这些对象的结构。这个模式的...

    实例讲解iOS应用的设计模式开发中的Visitor访问者模式

    访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 紧接着,给出其类结构图。 访问者模式适用于数据结构相对稳定的系统,它把...

    decaf-lang#decaf-book-spec#visitor模式1

    rust中当然也可以有visitor模式这样的东西,比如

Global site tag (gtag.js) - Google Analytics