24.12.19
實驗 25:訪問者模式
本次實驗屬于模仿型實驗,通過本次實驗學生將掌握以下內容:
1、理解訪問者模式的動機,掌握該模式的結構;
2、能夠利用訪問者模式法解決實際問題。
[實驗任務一]:打包員
在我們課堂上的“購物車”的例子中,增加一個新的訪問者:打包員,負責對購物車中貨物裝包。
實驗要求:
1. 畫出對應的類圖;
2. 提交源代碼;
3. 注意編程規范。
- 類圖:
- 源代碼
public interface Product {
void accept(Visitor visitor);
}
public class Apple implements Product {
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class Book implements Product {
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BuyBasket {
private List<Product> list = new ArrayList<>();
public void accept(Visitor visitor) {
Iterator<Product> i = list.iterator();
while (i.hasNext()) {
i.next().accept(visitor);
}
}
public void addProduct(Product product) {
list.add(product);
}
public void removeProduct(Product product) {
list.remove(product);
}
}
public abstract class Visitor {
protected String name;
public void setName(String name) {
this.name = name;
}
public abstract void visit(Apple apple);
public abstract void visit(Book book);
}
public class Saler extends Visitor {
public void visit(Apple apple) {
System.out.println("收銀員 " + name + " 給蘋果過秤,然后計算其價格。");
}
public void visit(Book book) {
System.out.println("收銀員 " + name + " 直接計算書的價格。");
}
}
public class Customer extends Visitor {
public void visit(Apple apple) {
System.out.println("顧客 " + name + " 選蘋果。");
}
public void visit(Book book) {
System.out.println("顧客 " + name + " 買書。");
}
}
public class Packer extends Visitor {
public void visit(Apple apple) {
System.out.println("打包員 " + name + " 將蘋果裝入保護袋。");
}
public void visit(Book book) {
System.out.println("打包員 " + name + " 將書包裝入紙箱。");
}
}
public class XMLUtil {
// 該方法用于從 XML 配置文件中提取具體類的類名,并返回一個實例對象
public static Object getBean() {
try {
// 創建文檔對象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("config.xml"));
// 獲取包含類名的文本節點
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cName = classNode.getNodeValue();
// 通過類名生成實例對象并將其返回
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
public class Client {
public static void main(String[] args) {
// 創建產品
Product b1 = new Book();
Product b2 = new Book();
Product a1 = new Apple();
// 創建購物籃
BuyBasket basket = new BuyBasket();
basket.addProduct(b1);
basket.addProduct(b2);
basket.addProduct(a1);
// 動態獲取訪問者
Visitor visitor = (Visitor) XMLUtil.getBean();
visitor.setName("李四");
// 訪問購物籃中的商品
basket.accept(visitor);
}
}
浙公網安備 33010602011771號