本篇內(nèi)容主要講解“設(shè)計(jì)模式系列之訪(fǎng)問(wèn)者模式的優(yōu)點(diǎn)有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“設(shè)計(jì)模式系列之訪(fǎng)問(wèn)者模式的優(yōu)點(diǎn)有哪些”吧!
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)烏拉特前免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
訪(fǎng)問(wèn)者模式的基本概念:封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)中元素上的操作。其有一個(gè)重要的特征是可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義一些新的操作。
簡(jiǎn)單來(lái)說(shuō)訪(fǎng)問(wèn)者模式主要的作用就是將“數(shù)據(jù)結(jié)構(gòu)”和“數(shù)據(jù)操作”進(jìn)行分離,解決這兩者之間耦合性的問(wèn)題。
訪(fǎng)問(wèn)者模式的基本執(zhí)行原理就是在被訪(fǎng)問(wèn)的類(lèi)里添加一個(gè)接口,用于接待訪(fǎng)問(wèn)者。
一般數(shù)情況下,當(dāng)我們需要對(duì)一個(gè)數(shù)據(jù)結(jié)構(gòu)中的元素進(jìn)行很多不同的操作,并且這些操作彼此之間并沒(méi)有關(guān)聯(lián),同時(shí)我們還想做到避免因?yàn)檫@些操作而“污染”了這些元素時(shí),就可考慮使用訪(fǎng)問(wèn)者模式。
類(lèi)圖講解
Visitor:抽象訪(fǎng)問(wèn)角色;通常情況下該數(shù)據(jù)結(jié)構(gòu)中有幾個(gè)元素就會(huì)對(duì)應(yīng)的在該類(lèi)中為每一個(gè)元素提供一個(gè)訪(fǎng)問(wèn)操作(方法)。
ConcreteVisitor:具體訪(fǎng)問(wèn)者角色;繼承了Visitor并實(shí)現(xiàn)了其中定義的所以方法。
Element:抽象元素角色;該類(lèi)會(huì)定義一個(gè)accept(接收)方法,用于接收訪(fǎng)問(wèn)者。
ConcreteElement:具體元素角色;繼承了Element并實(shí)現(xiàn)了其中定義的accept方法。
ObjectStruture:該類(lèi)定義了數(shù)據(jù)結(jié)構(gòu)(對(duì)象結(jié)構(gòu)),管理了所有元素,并且可以枚舉它的元素(也就是遍歷)。
案例:開(kāi)發(fā)一個(gè)員工審批功能,具體為不同角色的員工可以進(jìn)行“同意”和“不同意”的審批。
抽象員工類(lèi) => 對(duì)應(yīng)Element(抽象元素角色)
public abstract class Workers { // 提供一個(gè)讓訪(fǎng)問(wèn)者訪(fǎng)問(wèn)的方法 public abstract void accept(Action action); }
具體員工類(lèi)
/** * 經(jīng)理 */ public class Manager extends Workers { /** * 這里用到了雙分派。 * 第一次分派:在客戶(hù)端中將具體的Action作為參數(shù)傳遞到Manager中。 * 第二次分派:Manager類(lèi)調(diào)用Action中的具體方法,并將自己作為參數(shù)傳入。 */ @Override public void accept(Action action) { action.managerVerify(this); } } /** * 組長(zhǎng) */ public class GroupLeader extends Workers { @Override public void accept(Action action) { action.groupLeaderVerify(this); } }
抽象行為類(lèi) => 對(duì)應(yīng)Visitor(抽象訪(fǎng)問(wèn)角色)
public abstract class Action { // 經(jīng)理進(jìn)行審批 public abstract void managerVerify(Manager manager); // 組長(zhǎng)進(jìn)行審批 public abstract void groupLeaderVerify(GroupLeader groupLeader); }
具體行為類(lèi)
/** * 同意 */ public class Agree extends Action { @Override public void managerVerify(Manager manager) { System.out.println("經(jīng)理的審核結(jié)果為同意!"); } @Override public void groupLeaderVerify(GroupLeader groupLeader) { System.out.println("組長(zhǎng)的審核結(jié)果為同意!"); } } /** * 不同意 */ public class Disagree extends Action { @Override public void managerVerify(Manager manager) { System.out.println("經(jīng)理的審核結(jié)果為不同意!"); } @Override public void groupLeaderVerify(GroupLeader groupLeader) { System.out.println("組長(zhǎng)的審核結(jié)果為不同意!"); } }
ObjectStructure類(lèi)
public class ObjectStructure { // 維護(hù)了一個(gè)集合 private List<Workers> peoples = new ArrayList<>(); // 增加 public void attach(Workers workers) { peoples.add(workers); } // 移除 public void detach(Workers workers) { peoples.remove(workers); } // 顯示測(cè)評(píng)情況 public void display(Action action) { for (Workers people : peoples) { people.accept(action); } } }
客戶(hù)端測(cè)試類(lèi)
public class Client { public static void main(String[] args) { ObjectStructure objectStructure = new ObjectStructure(); // 添加人 objectStructure.attach(new Manager()); objectStructure.attach(new GroupLeader()); // 同意 Agree agree = new Agree(); objectStructure.display(agree); } }
執(zhí)行結(jié)果
優(yōu)點(diǎn):
1、訪(fǎng)問(wèn)者模式符合單一職責(zé)原則。
2、可以讓數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作之間解耦。
3、避免了因?yàn)椴僮髟囟鴮?duì)其造成污染的問(wèn)題。
4、讓程序具有擴(kuò)展性的情況下還大大增加了靈活性。
缺點(diǎn):
1、因?yàn)榫唧w的元素對(duì)訪(fǎng)問(wèn)者公布了實(shí)現(xiàn)細(xì)節(jié),所以訪(fǎng)問(wèn)者模式是違背了迪米特法則的。這樣做會(huì)導(dǎo)致元素變化比較困難。
2、因?yàn)樵L(fǎng)問(wèn)者依賴(lài)的是具體的元素而不是其抽象父類(lèi),所有該模式還違背了依賴(lài)倒轉(zhuǎn)原則。
到此,相信大家對(duì)“設(shè)計(jì)模式系列之訪(fǎng)問(wèn)者模式的優(yōu)點(diǎn)有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章標(biāo)題:設(shè)計(jì)模式系列之訪(fǎng)問(wèn)者模式的優(yōu)點(diǎn)有哪些
分享鏈接:http://www.rwnh.cn/article10/jijpgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站改版、全網(wǎng)營(yíng)銷(xiāo)推廣、品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)