HTTP 狀態消息
886
2025-04-03
文章目錄
模式定義
模式角色
模式分析
模式例子
模式應用
模式定義
訪問者模式:表示一個作用于某對象結構中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。所以訪問者模式是一種對象行為型模式。
模式角色
訪問者模式包括如下角色:
Vistor(抽象訪問者)
ConcreteVisitor(具體訪問者)
Element(抽象元素)
ConcreteElement(具體元素)
ObjectStructure(對象結構)
模式分析
訪問者模式的對象結構存儲了不同類型的元素對象,以供不同的訪問者訪問
訪問者模式包括了兩個層次結構,一個是訪問者層次結構,提供了抽象訪問者和具體訪問者,一個是元素層級結構,提供了抽象元素和具體元素
相同的訪問者可以以不同的方式訪問不同的元素,相同的元素可以接受不同的訪問者以不同訪問方式訪問。
典型代碼:
抽象訪問者類
public abstract class Visitor { public abstract void visit(ConcreteElementA elementA); public abstract void visit(ConcreteElementB elementB); public void visit(ConcreteElementC elementC) { //元素ConcreteElementC操作代碼 } }
1
2
3
4
5
6
7
8
9
10
具體訪問者類
public class ConcreteVisitor extends Visitor { public void visit(ConcreteElementA elementA) { //元素ConcreteElementA操作代碼 } public void visit(ConcreteElementB elementB) { //元素ConcreteElementB操作代碼 } }
1
2
3
4
5
6
7
8
9
10
11
12
抽象元素類
public interface Element { public void accept(Visitor visitor); }
1
2
3
4
5
具體元素類
public class ConcreteElementA implements Element { public void accept(Visitor visitor) { visitor.visit(this); } public void operationA() { //業務方法 } }
1
2
3
4
5
6
7
8
9
10
11
12
13
對象結構類
public class ObjectStructure { private ArrayList list=new ArrayList(); public void accept(Visitor visitor) { Iterator i=list.iterator(); while(i.hasNext()) { ((Element)i.next()).accept(visitor); } } public void addElement(Element element) { list.add(element); } public void removeElement(Element element) { list.remove(element); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
模式例子
本例子來自《設計模式》一書
實例一:購物車
顧客在超市中將選擇的商品,如蘋果、圖書等放在購物車中,然后到收銀員處付款。在購物過程中,顧客需要對這些商品進行訪問,以便確認這些商品的質量,之后收銀員計算價格時也需要訪問購物車內顧客所選擇的商品。此時,購物車作為一個ObjectStructure(對象結構)用于存儲各種類型的商品,而顧客和收銀員作為訪問這些商品的訪問者,他們需要對商品進行檢查和計價。不同類型的商品其訪問形式也可能不同,如蘋果需要過秤之后再計價,而圖書不需要。使用訪問者模式來設計該購物過程。
抽象的訪問者類
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); }
1
2
3
4
5
6
7
8
9
10
11
12
13
具體的訪問者類:
public class Saler extends Visitor { public void visit(Apple apple) { System.out.println("收銀員" + name + "給蘋果過秤,然后計算其價格。"); } public void visit(Book book) { System.out.println("收銀員" + name + "直接計算書的價格。"); } }
1
2
3
4
5
6
7
8
9
10
11
12
public class Customer extends Visitor { public void visit(Apple apple) { System.out.println("顧客" + name + "選蘋果。"); } public void visit(Book book) { System.out.println("顧客" + name + "買書。"); } }
1
2
3
4
5
6
7
8
9
10
11
12
元素接口類:
public interface Product { void accept(Visitor visitor); }
1
2
3
4
具體的元素類:
public class Apple implements Product { public void accept(Visitor visitor) { visitor.visit(this); } }
1
2
3
4
5
6
7
public class Book implements Product { public void accept(Visitor visitor) { visitor.visit(this); } }
1
2
3
4
5
6
7
對象結構類:
import java.util.*; public class BuyBasket { private ArrayList list=new ArrayList(); public void accept(Visitor visitor) { Iterator i=list.iterator(); while(i.hasNext()) { ((Product)i.next()).accept(visitor); } } public void addProduct(Product product) { list.add(product); } public void removeProduct(Product product) { list.remove(product); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
客戶端類:
public class Client { public static void main(String a[]) { Product b1=new Book(); Product b2=new Book(); Product a1=new Apple(); Visitor visitor; BuyBasket basket=new BuyBasket(); basket.addProduct(b1); basket.addProduct(b2); basket.addProduct(a1); visitor=(Visitor)XMLUtil.getBean(); visitor.setName("張三"); basket.accept(visitor); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; 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; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
config.xml
1
2
3
4
模式應用
java xml處理的DOM4j,通過訪問者模式的方式來讀取并解析XML文檔,VisitorSupport是DOM4J提供的Visitor接口的默認適配器
public class MyVisitor extends VisitorSupport { public void visit(Element element) { System.out.println(element.getName()); } public void visit(Attribute attr) { System.out.println(attr.getName()); } },
1
2
3
4
5
6
7
8
9
10
11
12
…
XML
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。