//Visitor design pattern // 1. Dodati accept(Visitor) metod hijerarhiji "element" /* C++, Java su tzv. dynamic uni-dispatch jezici. Kod njih Visitor tehnikom double dispatch pomaze da se klasama dodaju operacije , a da se klase ne menjaju. Ovde je metod accept primer double dispatch operacije, tj.operacije dvokriterijumske otpreme, jer izvrsavanje operacije accept zavisi od vrste zahteva, ali i od tipa Posetioca (interface Visitor) i tipa Elementa (interface Clan) */ // 2. Kreirati "visitor" osnovnu klasu i visit() method za svaki tip "element" // 3. Kreirati "visitor" izvedenu klasu za svaku "operaciju" koja se izvodi nad "elementima" // 4. Klijent kreira "visitor" objekte i prosledjuje ga pri pozivu accept() interface Clan { public void accept( Visitor v ); // prvi dispatch // 1. accept(Visitor) } // interface class Ovaj implements Clan { public void accept( Visitor v ) { v.visit( this ); } // 1. accept(Visitor) public String ovajj() { return "Ovaj"; } // implementacija } class Neki implements Clan { public void accept( Visitor v ) { v.visit( this ); } public String neko() { return "Neki"; } } class Ostali implements Clan { public void accept( Visitor v ) { v.visit( this ); } public String preostali() { return "Ostali"; } } interface Visitor { // 2. "visitor" kreiranje public void visit( Ovaj item ); // drugi dispatch // osnovna klasa sa public void visit( Neki item ); // visit() metodom za public void visit( Ostali item ); // svaki "element" } // tip class UpVisitor implements Visitor { // 3.kreiranje "visitor" public void visit( Ovaj item ) { // izvedene klase za System.out.println( "Up nad " + item.ovajj() ); } // svaku "operaciju" public void visit( Neki item ) { System.out.println( "Up nad" + item.neko() ); } //nad "elementima" public void visit( Ostali item ) { System.out.println( "Up nad " + item.preostali() ); } } class DownVisitor implements Visitor { public void visit( Ovaj item ) { System.out.println( "Down nad " + item.ovajj() ); } public void visit( Neki item ) { System.out.println( "Down nad " + item.neko() ); } public void visit( Ostali item ) { System.out.println( "Down nad " + item.preostali() ); } } class Visitor1 { public static Clan[] list = { new Ovaj(), new Neki(), new Ostali() }; public static void main( String[] args ) { UpVisitor up = new UpVisitor(); // 4.Klijent kreira DownVisitor down = new DownVisitor(); // "visitor" objekte for (int i=0; i < list.length; i++) //i svaki prosledjuje list[i].accept( up ); // pozivima accept() for (int i=0; i < list.length; i++) list[i].accept( down ); } }