2016-10-20 11 views
0

私は本当にこのインターフェイスの重要性を理解しようとしていますが、私たちがより迅速に書くのを手助けする以外に、(メソッドを実装するだけで)具体的なクラスのメソッドを使用する必要はありません。訪問者パターンのIVisitableインターフェイスの使用方法は?

定義は、この

受け入れる操作を宣言する抽象化です。これは訪問者 オブジェクトによってオブジェクトが「訪問」されることを可能にする エントリポイントです。 コレクションから各オブジェクトは

を訪れたことができるようにする ために、この抽象化を実装する必要があります。」 その明確な、しかしまだあなたはそれらが不要なのがたくさんあるごとに単一のクラス(のメソッドを受け入れる書くてmanualyすることができます私は同意する仕事)が、まだ横にあなたは...クラスが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"); 
//  
// } 
//  


} 
+0

こちらをご覧下さい - http://stackoverflow.com/a/39174843/4390212 – DimaSan

+1

あなたは私たちにIVistableインタフェースを示してもらえと定義のソース?私が知っているvisitorパターンには2つのインターフェースがあります。たとえば:https://en.wikipedia.org/wiki/Visitor_pattern –

+0

ですから、私は理解しているから、別のオブジェクトの配列を持っていると便利です。 polymorphismを使ってacceptメソッドを呼び出しますか? – BabaMara

答えて

0

はあなたmain()方法を調べてください:あなただけの直接terra._br_godina = 3を呼び出していないため、すべての訪問者を使用する必要ことができます。

訪問者は、terraの具体的なタイプがわからず、あなたの望みに合わせてどのメソッドを呼び出すべきかわからない場合にも便利です。あなたが持っているのは抽象的なタイプまたはインターフェイスだけです。 Girl(またはIVisitable)。だから、Visitorパターンの有用性を実証するために、あなたの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()" 
} 
関連する問題