【问题标题】:What is the usage of the IVisitable interface in Visitor Pattern?访问者模式中IVisitable接口的用途是什么?
【发布时间】:2016-10-20 12:58:36
【问题描述】:

我真的很想了解这个接口的重要性,但是除了帮助我们更快地编写之外,具体类中的方法(通过仅实现方法)我就是找不到使用它的必要性。

定义是这样的

声明接受操作的抽象。这是 允许访问者“访问”对象的入口点 目的。 集合中的每个对象都应该在 为了能够被访问

。” 很清楚,但是您仍然可以在每个类中手动编写这些接受方法(我同意这是很多不必要的工作),但除此之外,您还可以在没有 IVisitable 接口的情况下使类可访问...

//IVisitable.java
package Visitor;

/**
*
* @author dragan
*/
public interface IVisitable {                 
    public void accept (Visitor v); 
}

// Bgirl.java

public class Bgirl implements  IVisitable{

    int _br_godina;

    public Bgirl(int g) {
        br_godina = g;
    }

    public int getBr_godina() {
        return _br_godina;
    }

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

}

// Main.java

package Visitor;

/**
*
* @author dragan
*/
public class Main {

    public static void main(String[] args) {

        Bgirl terra = new Bgirl(5);  

        System.out.println(terra.getBr_godina());

        VisitorImplement v = new VisitorImplement();              

    }  
}

// VisitorImplement.java

package Visitor;

/**
 *
 * @author dragan
 */
public class VisitorImplement implements Visitor{

    @Override
    public void visit(Bgirl prva) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

      prva._br_godina = 3;

    }

//    @Override
//    public void visit(Bboy prvi) {
//       // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
//        System.out.println("BBOY VISIT");
//    
//    }
//    


}

【问题讨论】:

  • 您能告诉我们IVistable接口和定义的来源吗?我所知道的visitorpattern中涉及到两个接口,例如在:en.wikipedia.org/wiki/Visitor_pattern
  • 所以据我了解,当你有一个不同对象的数组时它很有用,你可以通过多态调用accept方法?
  • 您不需要一个不同对象的数组来作为访问者模式的一个很好的例子。您需要对一些允许访问/实现 IVistable 的不同类进行两种不同的操作。
  • 您的问题听起来好像您在问为什么要在大多数设计模式中使用接口——这种抽象有什么好处。如果是这样,那么您将想要获得并阅读一本关于设计模式的好书,例如 Gang of Four 书或 Heads Up 书。

标签: java design-patterns


【解决方案1】:

查看您的main() 方法:您可以直接调用terra._br_godina = 3,因此无需使用任何访问者。

当您不知道terra 的具体类型,甚至不知道应该调用哪个方法来满足您的愿望时,访问者很有用。你所拥有的只是一个抽象类型或接口,例如Girl(或IVisitable)。所以,为了展示访问者模式的用处,你的main() 方法应该是这样的:

public static void main(String[] args) {
    IVisitable terra = new Bgirl(5);
    // Want to set _br_godina of terra to 3 but do not and cannot know
    // which method should be called
    // Let's create a visitor and let him visit her,
    // he knows how to set _br_godina of her to 3
    VisitorImplement v = new VisitorImplement();
    terra.accept(v); // luckily, every girl accepts the "accept()"
}

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2010-12-31
    • 1970-01-01
    • 2012-07-13
    • 2017-06-01
    相关资源
    最近更新 更多