《大話設計模式》—— 讀後感(28)男人和女人——訪問者模式
阿新 • • 發佈:2019-02-13
訪問者模式
表示一個作用於某物件結構中的各個元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。(摘抄)
從這個名字也可以看出來,這個模式就是針對於物件訪問的模式,這個模式裡面的每一各具體訪問者,代表一個具體的操作,當你需要增加操作的時候十分方便,不過這個裡面的訪問者類和具體的去訪問的類耦合十分緊密,所以說這個模式的侷限性也很大,只適用於資料結構比較穩定的系統,它把資料結構和作用於結構上的操作之間的耦合解開了,轉移到了訪問者類之中。有比較穩定的資料結構,和易於變化的演算法的話,使用訪問者模式就十分方便。
import java.util.ArrayList; import java.util.List; public abstract class Visitor { public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); public abstract void visitConcreteElementB(ConcreteElementB concreteElementB); } public abstract class Element { public abstract void Accept(Visitor visitor); } public class ConcreteElementA extends Element { @Override public void Accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visitConcreteElementA(this); } } public class ConcreteElementB extends Element { @Override public void Accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visitConcreteElementB(this); } } public class ConcreteVisitor1 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementA.getClass()); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementB.getClass()); } } public class ConcreteVisitor2 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementA.getClass()); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementB.getClass()); } } public class ObjectStructure { private List<Element> lists = new ArrayList<Element>(); public void addElement(Element element) { lists.add(element); } public void deleteElement(Element element) { lists.remove(element); } public void Accept(Visitor visitor) { for (Element element : lists) { element.Accept(visitor); } } } class Client { public static void main() { ObjectStructure objectStructure = new ObjectStructure(); objectStructure.addElement(new ConcreteElementA()); objectStructure.addElement(new ConcreteElementB()); ConcreteVisitor1 concreteVisitor1 = new ConcreteVisitor1(); ConcreteVisitor2 concreteVisitor2 = new ConcreteVisitor2(); objectStructure.Accept(concreteVisitor1); objectStructure.Accept(concreteVisitor2); } }
大多數時候你並不需要訪問者模式,但當一旦你需要訪問者模式時,那就是真的需要它了。(摘抄)