日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式之行为型:访问者模式

發布時間:2024/9/30 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式之行为型:访问者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景:

? ? ? ? 去醫院看病時,醫生會給你一個處方單要你去拿藥,拿藥我們可以分為兩步走:

  • (1)去柜臺交錢,劃價人員會根據處方單上的藥進行劃價,交錢。
  • (2)去藥房拿藥,藥房工作者同樣根據處方單給你相對應的藥。

????????這里我們就劃價和拿藥兩個步驟進行討論,這里有三個類,處方單(藥)、劃價人員、藥房工作者。同時劃價人員和藥房工作者都各自有一個動作:劃價、拿藥。這里進行最初步的設計如下:

劃價人員:

public class Charge {public void action(){public void action(){if("A藥".equals(medicine)){//A的價格}if("B藥".equals(medicine)){//B的價格}if("C藥".equals(medicine)){//C的價格}if("D藥".equals(medicine)){//D的價格}if("E藥".equals(medicine)){//E的價格}............}} }

藥房工作者:

public class WorkerOfPharmacy {public void action(){if("A藥".equals(medicine)){//給你A藥}if("B藥".equals(medicine)){//給你B藥}if("C藥".equals(medicine)){//給你C藥}if("D藥".equals(medicine)){//給你D藥}if("E藥".equals(medicine)){//給你E藥}............} }

? ? ? ? 這樣的代碼寫法,在藥品種類少的情況沒什么問題,但也存在這么多的 if…else,而且我們可以想象醫院里的藥是那么多,而且隨時都會增加的,增加了藥就要改變劃價人員和藥房工作者的代碼,這是我們最不希望改變的。那么有沒有辦法來解決呢?有,訪問者模式提供一中比較好的解決方案。

????????在實際開發過程中,我們對同個對象可能存在不同的操作方式,如處方單,劃價人員要根據它來劃價,藥房工作者要根據它來給藥。而且可能會隨時增加新的操作,如醫院增加新的藥物,但是這里有兩個元素是保持不變的,或者說很少變:劃價人員和藥房工作中,變的只不過是他們的操作。所以我們想如果能夠將他們的操作抽象化就好了,這里訪問者模式就是一個值得考慮的解決方案了。

一、什么是訪問者模式:

? ? ? ? 訪問者模式適用于數據結構相對穩定的系統,將數據結構與基于數據的操作進行分離,使得添加作用于這些數據結構的新操作變得簡單,并且不需要改變各數據結構,為不同類型的數據結構提供多種訪問操作方式,這樣是訪問者模式的設計動機。

? ? ? ? 除了使新增訪問操作變得更加簡單,也能夠在不修改現有類的層次結構下,定義該類層次結構的操作,并將有關元素對象的訪問行為集中到一個訪問者對象中,而不是分散搞一個個的元素類中。

? ? ? ?但訪問者模式的缺點在于讓增加新的元素類變得困難,每增加一個新的元素類都意味著要在抽象訪問者角色中增加一個新的抽象操作,并在每一個具體訪問者類中增加相應的具體操作,違背了“開閉原則”的要求;

? ? ? ? 所以訪問者模式適用于對象結構中很少改變,但經常需要在此對象結構上定義新的操作的系統,使得算法操作的增加變得簡單;或者需要對一個對象結構中進行很多不同并且不相關的操作,并且需要避免讓這些操作污染這些對象,也不希望在增加新操作時修改這些類的場景

二、UML結構圖:

  • Vistor:抽象訪問者,聲明了對?ConcreteElement 類的一些操作?
  • ConcreteVisitor:具體訪問者,實現抽象訪問者中聲明的每一個操作
  • Element:抽象元素,定義一個 accept 操作,用于接收具體訪問者?
  • ConcreteElement:具體元素 ,實現 accept 操作。?
  • ObjectStructure:對象結構,提供一個高層接口來允許訪問者枚舉它的元素

????????從上面的 UML結構圖中我們可以看出,訪問者模式主要分為兩個層次結構,一個是訪問者層次結構,提供了抽象訪問者和具體訪問者,主要用于聲明一些操作;一個是元素層次結構,提供了抽象元素和具體元素,主要用于聲明 accept 操作;而對象結構作為兩者的橋梁,存儲了不同類型的對象,以便不同的訪問者來訪問,相同訪問者可以以不同的方式訪問不同的元素,所以在訪問者模式中增加新的訪問者無需修改現有代碼,可擴展行強。

????????在訪問者模式使用了雙分派技術,所謂雙分派技術就是在選擇方法的時候,不僅僅要根據消息接收者的運行時區別,還要根據參數的運行時區別。在訪問者模式中,客戶端將具體狀態當做參數傳遞給具體訪問者,這里完成第一次分派,然后具體訪問者作為參數的“具體狀態”中的方法,同時也將自己this作為參數傳遞進去,這里就完成了第二次分派。雙分派意味著得到的執行操作決定于請求的種類和接受者的類型。

二、模式的實現:

????????以上面在醫院付費、取藥為實例。在這個實例中劃價員和藥房工作者作為訪問者,藥品作為訪問元素、處方單作為對象結構,所以整個UML結構圖如下:

抽象訪問者:Visitor.java

public abstract class Visitor {protected String name;public void setName(String name) {this.name = name;}public abstract void visitor(MedicineA a);public abstract void visitor(MedicineB b); }

具體訪問者:劃價員、Charger.java

public class Charger extends Visitor{public void visitor(MedicineA a) {System.out.println("劃價員:" + name +"給藥" + a.getName() +"劃價:" + a.getPrice());}public void visitor(MedicineB b) {System.out.println("劃價員:" + name +"給藥" + b.getName() +"劃價:" + b.getPrice());} }

具體訪問者:藥房工作者、WorkerOfPharmacy.java

public class WorkerOfPharmacy extends Visitor{public void visitor(MedicineA a) {System.out.println("藥房工作者:" + name + "拿藥 :" + a.getName());}public void visitor(MedicineB b) {System.out.println("藥房工作者:" + name + "拿藥 :" + b.getName());} }

抽象元素:Medicine.java

public abstract class Medicine {protected String name;protected double price;public Medicine (String name,double price){this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public abstract void accept(Visitor visitor); }

具體元素:MedicineA.java

public class MedicineA extends Medicine{public MedicineA(String name, double price) {super(name, price);}public void accept(Visitor visitor) {visitor.visitor(this);} }

具體元素:MedicineB.java

public class MedicineB extends Medicine{public MedicineB(String name, double price) {super(name, price);}public void accept(Visitor visitor) {visitor.visitor(this);} }

藥單:Presciption.java

public class Presciption {List<Medicine> list = new ArrayList<Medicine>();public void accept(Visitor visitor){Iterator<Medicine> iterator = list.iterator();while (iterator.hasNext()) {iterator.next().accept(visitor);}}public void addMedicine(Medicine medicine){list.add(medicine);}public void removeMedicien(Medicine medicine){list.remove(medicine);} }

客戶端:Client.java

public class Client {public static void main(String[] args) {Medicine a = new MedicineA("板藍根", 11.0);Medicine b = new MedicineB("感康", 14.3);Presciption presciption = new Presciption();presciption.addMedicine(a);presciption.addMedicine(b);Visitor charger = new Charger();charger.setName("張三");Visitor workerOfPharmacy = new WorkerOfPharmacy();workerOfPharmacy.setName("李四");presciption.accept(charger);System.out.println("-------------------------------------");presciption.accept(workerOfPharmacy);} }

運行結果:


設計模式系列文章:

Java設計模式之創建型:工廠模式詳解(簡單工廠+工廠方法+抽象工廠)

Java設計模式之創建型:建造者模式

Java設計模式之創建型:單例模式

Java設計模式之創建型:原型模式

Java設計模式之結構型:適配器模式

Java設計模式之結構型:裝飾器模式

Java設計模式之結構型:代理模式

Java設計模式之結構型:橋接模式

Java設計模式之結構型:外觀模式

Java設計模式之結構型:組合模式

Java設計模式之結構型:享元模式

Java設計模式之行為型:策略模式

Java設計模式之行為型:模板方法模式

Java設計模式之行為型:責任鏈模式

Java設計模式之行為型:觀察者模式

Java設計模式之行為型:訪問者模式

Java設計模式之行為型:中介者模式

Java設計模式之行為型:命令模式

Java設計模式之行為型:狀態模式

Java設計模式之行為型:備忘錄模式

Java設計模式之行為型:迭代器模式

Java設計模式之行為型:解釋器模式

總結

以上是生活随笔為你收集整理的Java设计模式之行为型:访问者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩在线精品 | 黄色国产视频 | 国产一线二线三线在线观看 | 久久久国产网站 | 51吃瓜网今日吃瓜 | 91一区二区在线 | 欧美一区二区三区四区在线 | 一级黄色片网址 | 国产成人亚洲一区二区 | 成人久久网站 | 国产情侣小视频 | 91九色中文 | 毛片视频网站在线观看 | 青青草久久伊人 | 在线观看成人一区 | 午夜影院福利社 | 浪浪视频在线观看 | av在线免费网址 | 国产欧美另类 | 国产精品久久无码一三区 | 肉丝袜脚交视频一区二区 | 免费在线观看av片 | 中文不卡在线 | 韩日成人 | 青青视频在线播放 | 欧美第一页 | 久久久久久久久国产精品 | 日韩一区在线播放 | 美女三级黄色 | 日韩在线视频观看 | 天天曰夜夜曰 | 麻豆免费在线观看视频 | 成人免费一区 | 少妇太紧太爽又黄又硬又爽 | 视频一区二区在线 | 国产古装艳史毛片hd | 综合精品久久 | 日韩成人综合网 | 黄色在线视频观看 | 男女黄色又爽大片 | 成人拍拍拍 | 久久这里只有 | 欧美精品卡一卡二 | 97香蕉久久超级碰碰高清版 | 极品尤物在线观看 | 午夜免费视频观看 | 国产精品亚洲一区 | 99视频在线精品免费观看2 | 欧美性色视频 | 少妇激情偷人爽爽91嫩草 | 午夜小影院| 日韩在线观看免费网站 | 五月天国产在线 | 国产激情网址 | 日本在线免费视频 | 国产黄色一区 | 好吊操免费视频 | 午夜一二三 | 久久精品蜜桃 | 国产欧美久久一区二区三区 | 久青草视频在线观看 | 91搞搞| 成年人免费在线 | 99色国产 | 又骚又黄的视频 | 三上悠亚亚洲一区 | 不卡的免费av | www四虎影院 | 日本午夜激情视频 | 欧美黄色一级 | 黑人巨大精品欧美 | 少女国产免费观看 | 日本欧美在线播放 | 亚洲电影在线看 | 久操超碰| 蜜桃精品噜噜噜成人av | 国产精品99久久久久久久久 | 婷婷中文字幕在线 | 亚洲AV无码国产精品国产剧情 | 国产一区二区三区精品在线 | 亚洲国产成人精品激情在线 | 成年人www| 黄色网页免费看 | 91在线日韩 | 亚洲五月婷 | 九色视频偷拍少妇的秘密 | 欧美日韩激情一区 | 日韩国产高清在线 | 另类国产| 毛片视| 91视频最新地址 | 97国产视频 | 喷潮在线| 亚洲免费片 | 狠狠干狠狠艹 | av网站国产 | 2019中文字幕在线视频 | a片在线免费观看 | 在线亚洲人成电影网站色www |