2016-10-20 3 views
0

Ich versuche wirklich, die Bedeutung dieser Schnittstelle zu verstehen, aber abgesehen davon, dass wir schneller die Methoden in den konkreten Klassen schreiben (indem wir nur die Methoden implementieren), kann ich einfach nicht die Notwendigkeit finden, sie zu benutzen.Wie wird die IVisitable-Schnittstelle im Besuchermuster verwendet?

Die Definition ist diese

eine Abstraktion, die den Betrieb übernehmen erklärt. Dies ist der Einstiegspunkt, mit dem ein Objekt vom Besucherobjekt " " "besucht" werden kann. Jedes Objekt aus einer Sammlung sollte diese Abstraktion in implementieren, um in der Lage sein

besucht werden.“ Seine klare, aber immer noch können Sie händisch die in jeder einzelnen Klasse akzeptieren Methoden schreiben (was viele nicht notwendig ist, arbeite ich zustimmen), aber immer noch, dass neben Ihnen eine Klasse ohne die IVisitable Schnittstelle besuchbar, bekommen ...

//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

bitte hier - http://stackoverflow.com/a/39174843/4390212 – DimaSan

+1

Könnten Sie bitte zeigen uns die IVistable Schnittstelle und die Quelle der Definition? Es gibt zwei Schnittstellen in dem Besuchermuster, die ich kenne, zum Beispiel: https://en.wikipedia.org/wiki/Visitor_pattern –

+0

also von dem, was ich verstehe, es ist nützlich, wenn Sie ein Array von verschiedenen Objekten haben, und Sie können die Accept-Methode durch Polymorphismus aufrufen? – BabaMara

Antwort

0

Schauen Sie in Ihre main() Methode: Sie können einfach direkt terra._br_godina = 3 anrufen und somit keine Notwendigkeit, jeden Besucher zu verwenden.

Ein Besucher ist nützlich, wenn Sie den konkreten Typ Ihrer terra nicht kennen und sogar nicht wissen, welche Methode aufgerufen werden sollte, um Ihren Wunsch zu erfüllen. Alles, was Sie haben, ist nur ein abstrakter Typ oder eine Schnittstelle, z. Girl (oder IVisitable). So demonstrieren die Nützlichkeit von Besucher Muster, Ihre main() Methode sollte wie folgt sein:

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()" 
}