中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

設(shè)計(jì)模式系列之訪(fǎng)問(wèn)者模式的優(yōu)點(diǎn)有哪些

本篇內(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)者模式。

訪(fǎng)問(wèn)者模式UML類(lèi)圖

設(shè)計(jì)模式系列之訪(fǎng)問(wèn)者模式的優(yōu)點(diǎ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é)果

設(shè)計(jì)模式系列之訪(fǎng)問(wèn)者模式的優(yōu)點(diǎn)有哪些

總結(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)

綿陽(yáng)服務(wù)器托管
曲水县| 专栏| 桃江县| 策勒县| 浮山县| 古浪县| 岑溪市| 宜章县| 商河县| 澜沧| 察隅县| 石首市| 靖州| 西乡县| 加查县| 中山市| 浮山县| 观塘区| 石嘴山市| 澎湖县| 项城市| 孝感市| 泗阳县| 拉萨市| 西乌珠穆沁旗| 宝清县| 谢通门县| 泰顺县| 镶黄旗| 克山县| 临沧市| 偃师市| 永顺县| 萍乡市| 临海市| 五原县| 江永县| 鞍山市| 车险| 华蓥市| 舟曲县|