訪問者模式封裝一些做用於某種數據結構中的各元素的操做,它能夠在不改變這個數據結構的前提下定義做用於這些元素的新的操做,屬於行爲型模式一種。 bash
優勢:數據結構
缺點:ide
定義Visitor(抽象訪問者)ui
public interface Visitor {
float visit(FoodElement food);
float visit(FruitElement fruit);
}
複製代碼
定義Element(抽象元素)this
public interface Element {
float accept(Visitor visitor);
}
複製代碼
定義具體元素FruitElementspa
public class FoodElement implements Element {
private float price;
private int num;
public FoodElement(int num, float price) {
this.num = num;
this.price = price;
}
public float getPrice() {
return price;
}
public int getNum() {
return num;
}
@Override
public float accept(Visitor visitor) {
return visitor.visit(this);
}
}
複製代碼
定義具體元素FruitElementcode
public class FruitElement implements Element {
private float price;
private int num;
public FruitElement(int num, float price) {
this.num = num;
this.price = price;
}
public float getPrice() {
return price;
}
public int getNum() {
return num;
}
@Override
public float accept(Visitor visitor) {
return visitor.visit(this);
}
}
複製代碼
定義具體的ConcreteVisitorcdn
public class ConcreteVisitor implements Visitor {
@Override
public float visit(FoodElement food) {
return food.getNum() * food.getPrice();
}
@Override
public float visit(FruitElement fruit) {
return fruit.getNum() * fruit.getPrice();
}
}
複製代碼
定義對象結構ObjectStructure對象
public class ObjectStructure {
private List<Element> list = new ArrayList<>();
/**
* 訪問者訪問元素的入口
*
* @param visitor 訪問者
*/
public void accept(Visitor visitor) {
for (int i = 0; i < list.size(); i++) {
Element element = list.get(i);
element.accept(visitor);
}
}
/**
* 把元素加入到集合
*
* @param element 待添加的元素
*/
public void addElement(Element element) {
list.add(element);
}
/**
* 把元素從集合中移除
*
* @param element 要移除的元素
*/
public void removeElement(Element element) {
list.remove(element);
}
}
複製代碼
客戶端使用blog
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.addElement(new FoodElement(10, 2));
objectStructure.addElement(new FruitElement(10, 2));
objectStructure.accept(new ConcreteVisitor());
複製代碼