CCF-回收站選址(100分)
阿新 • • 發佈:2020-08-04
定義:
訪問者模式(Visitor),表示一個作用於某物件結構中的各個元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。
訪問者模式適用於資料結構相對穩定的結構,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以自由的演化。
訪問者模式的目的是,要把處理從資料結構上分離出來。有比較穩定的資料結構,又有易於變化的演算法的話,使用訪問者模式是比較的適合的,因為訪問者模式使演算法的操作增加變得容易。
訪問者模式的 缺點使把增加新得資料結構變得困難。
自己理解思路圖:
實現程式碼如下:
1 public abstract class Visitor {Visitor2 public abstract void visitConcreteElementA(ConcreteElementA conA); 3 public abstract void visitConcreteElementB(ConcreteElementB conB); 4 }
1 public class ConcreteVisitor1 extends Visitor { 2 3 @Override 4 public void visitConcreteElementA(ConcreteElementA conA) { 5ConcreteVisitor1System.out.println(this.getClass().getName()+"----"+conA.getClass().getName()); 6 7 } 8 9 @Override 10 public void visitConcreteElementB(ConcreteElementB conB) { 11 System.out.println(this.getClass().getName()+"----"+conB.getClass().getName()); 12 } 13 14 }
1 public class ConcreteVisitor2 extends Visitor { 2 3 @Override 4 public void visitConcreteElementA(ConcreteElementA conA) { 5 System.out.println(this.getClass().getName()+"----"+conA.getClass().getName()); 6 7 } 8 9 @Override 10 public void visitConcreteElementB(ConcreteElementB conB) { 11 System.out.println(this.getClass().getName()+"----"+conB.getClass().getName()); 12 13 } 14 15 }ConcreteVisitor2
1 public abstract class Element { 2 public abstract void accept(Visitor visitor); 3 }Element
1 public class ConcreteElementA extends Element{ 2 3 @Override 4 public void accept(Visitor visitor) { 5 visitor.visitConcreteElementA(this); 6 } 7 public void operateA(){ 8 9 } 10 11 }ConcreteElementA
1 public class ConcreteElementB extends Element{ 2 3 @Override 4 public void accept(Visitor visitor) { 5 visitor.visitConcreteElementB(this); 6 } 7 8 public void operateB(){ 9 10 } 11 12 }ConcreteElementB
1 public class TestVisitor { 2 public static void main(String[] args) { 3 ObjectStructure ob = new ObjectStructure(); 4 ob.attach(new ConcreteElementA()); 5 ob.attach(new ConcreteElementB()); 6 7 Visitor v1 = new ConcreteVisitor1(); 8 Visitor v2 = new ConcreteVisitor2(); 9 10 ob.accept(v1); 11 ob.accept(v2); 12 13 } 14 }test
com.cai.designMethods.visitor.ConcreteVisitor1----com.cai.designMethods.visitor.ConcreteElementA com.cai.designMethods.visitor.ConcreteVisitor1----com.cai.designMethods.visitor.ConcreteElementB com.cai.designMethods.visitor.ConcreteVisitor2----com.cai.designMethods.visitor.ConcreteElementA com.cai.designMethods.visitor.ConcreteVisitor2----com.cai.designMethods.visitor.ConcreteElementB測試列印