設計模式之訪問者模式(行為型)

      網友投稿 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

      Saler

      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小時內刪除侵權內容。

      上一篇:wps如何擦除表格邊框
      下一篇:word表格的制作方法(word表格怎么制作)
      相關文章
      亚洲国产熟亚洲女视频| 18亚洲男同志videos网站| 亚洲精品在线不卡| 亚洲国产精品va在线播放| 国产成人亚洲精品狼色在线| 亚洲 另类 无码 在线| 激情婷婷成人亚洲综合| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲日本天堂在线| 亚洲熟伦熟女专区hd高清| 日韩亚洲人成在线| 亚洲码欧美码一区二区三区| 中文字幕乱码亚洲精品一区| 亚洲色偷偷色噜噜狠狠99网| 亚洲欧洲精品成人久久曰| 亚洲国产美女精品久久久| 亚洲国产成人久久精品软件| 豆国产96在线|亚洲| 亚洲av综合日韩| 亚洲国产成人影院播放| 亚洲熟女乱综合一区二区| 77777亚洲午夜久久多人| 亚洲日产韩国一二三四区| 日本亚洲视频在线| 亚洲国产老鸭窝一区二区三区| 老司机亚洲精品影院| 亚洲日本国产精华液| 精品亚洲456在线播放| 亚洲熟妇AV日韩熟妇在线| 欧美激情综合亚洲一二区| 亚洲第一页日韩专区| 相泽亚洲一区中文字幕| 亚洲成a人片在线观看无码专区| 亚洲av鲁丝一区二区三区| 亚洲美女一区二区三区| 国产精品亚洲精品观看不卡| 亚洲熟妇AV一区二区三区宅男| 一本色道久久88亚洲综合| 国产亚洲一区区二区在线| 亚洲成AV人片一区二区密柚| 91天堂素人精品系列全集亚洲|