摘要:中介者模式的應(yīng)用中介者模式的優(yōu)點(diǎn)就是減少類間的依賴,將一對多的依賴變成一對一的依賴,降低耦合,符合迪米特法則。中介者模式適用于多個(gè)對象之間出現(xiàn)緊密聯(lián)系,類圖成網(wǎng)狀結(jié)構(gòu),使用中介者模式可以梳理為星型結(jié)構(gòu),有助于理解其關(guān)系。
前言
由于最近瘋狂加班,博客都停更許久,難過~.~
中介者模式定義用一個(gè)中介對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使其耦合松散,而且可以獨(dú)立地改變他們之間的交互。uml類圖 代碼分析
我們來模仿一個(gè)進(jìn)銷存系統(tǒng),主要有三個(gè)部分,銷售、庫存和進(jìn)貨。
/** * 采購管理,主要負(fù)責(zé)是否采購糖果 */ public class CandyPurchase { public void buyCandy(int number){ CandySale candySale = new CandySale(); CandyStock candyStock = new CandyStock(); if (candySale.getSaleStauts()>6){ candyStock.addStock(number); System.out.println("采購糖果"+number+"顆"); }else { candyStock.addStock(number/2); System.out.println("采購糖果"+number/2+"顆"); } System.out.println("庫存"+CandyStock.stockNum+"顆"); } public void refuseBuyCandy(){ System.out.println("拒絕進(jìn)貨"); } }
/** * 銷售類: */ public class CandySale { public void saleCandy(int num){ while (CandyStock.stockNum //庫存 public class CandyStock { //庫存數(shù)量 protected static int stockNum =1000; public synchronized void addStock(int num){ stockNum+=num; } public synchronized void subtractStock(int num){ stockNum-=num; } public void clearStock(){ System.out.println("馬上年底了,清倉大甩賣了"); CandyPurchase candyPurchase = new CandyPurchase(); candyPurchase.refuseBuyCandy(); CandySale candySale = new CandySale(); candySale.discountSale(); } }public class Client { public static void main(String[] args) { System.out.println("-----采購糖果-----"); CandyPurchase candyPurchase = new CandyPurchase(); candyPurchase.buyCandy(666); System.out.println("-----銷售糖果-----"); CandySale candySale = new CandySale(); candySale.saleCandy(20); System.out.println("-----清庫處理-----"); CandyStock candyStock = new CandyStock(); candyStock.clearStock(); } } 測試結(jié)果: -----采購糖果----- 采購糖果666顆 庫存1666顆 -----銷售糖果----- 賣出20顆糖 -----清庫處理----- 馬上年底了,清倉大甩賣了 拒絕進(jìn)貨 打折銷售糖果1646顆結(jié)果和我們預(yù)期的一致,但我們這三者是彼此關(guān)聯(lián)的,每個(gè)類都與其他兩個(gè)類發(fā)生了關(guān)系(純潔點(diǎn),不要想歪~,~)。迪米特法則認(rèn)為每個(gè)類應(yīng)只和朋友類交流,而且朋友類并非越多越好,朋友類越多,耦合性越大,修改一個(gè)就要從全局考量是否影響到了其他模塊,這不是面向?qū)ο笤O(shè)計(jì)所期望的。讓我們用中介者模式把其優(yōu)化下吧,代碼如下:
public abstract class AbstractCandyMediator { protected CandyStock candyStock; protected CandySale candySale; protected CandyPurchase candyPurchase; public AbstractCandyMediator() { this.candyStock = new CandyStock(this); this.candySale = new CandySale(this); this.candyPurchase = new CandyPurchase(this); } public abstract void execute(String type,Object ...objects); }public class ConcreteCandyMediator extends AbstractCandyMediator{ @Override public void execute(String type, Object... objects) { if (type.equals("buyCandy")){ this.buyCandy((Integer) objects[0]); }else if (type.equals("saleCandy")){ this.saleCandy((Integer) objects[0]); }else { this.clearStock(); } } private void buyCandy(int num) { if (super.candySale.getSaleStauts()>6){ super.candyStock.addStock(num); System.out.println("采購糖果"+ num+"顆"); }else { super.candyStock.addStock(num/2); System.out.println("采購糖果"+num /2+"顆"); } System.out.println("庫存"+CandyStock.stockNum+"顆"); } public void saleCandy(int num){ while (CandyStock.stockNum public abstract class AbstractColleague { public AbstractCandyMediator mediator; public AbstractColleague(AbstractCandyMediator mediator) { this.mediator = mediator; } }public class CandyPurchase extends AbstractColleague { public CandyPurchase(AbstractCandyMediator abstractCandyMediator) { super(abstractCandyMediator); } public void buyCandy(int number){ super.mediator.execute("buyCandy",number); } public void refuseBuyCandy(){ System.out.println("拒絕進(jìn)貨"); } }public class CandySale extends AbstractColleague { public CandySale(AbstractCandyMediator abstractCandyMediator) { super(abstractCandyMediator); } public void saleCandy(int num){ super.mediator.execute("saleCandy",num); } //打折銷售 public void discountSale(){ System.out.println("打折銷售糖果"+CandyStock.stockNum+"顆"); } //獲得最近的銷售狀態(tài),0-10,越大越好賣 public int getSaleStauts(){ Random random = new Random(); return random.nextInt(10); } }public class CandyStock extends AbstractColleague{ //庫存數(shù)量 protected static int stockNum =1000; public CandyStock(AbstractCandyMediator abstractCandyMediator) { super(abstractCandyMediator); } public synchronized void addStock(int num){ stockNum+=num; } public synchronized void subtractStock(int num){ stockNum-=num; } public void clearStock(){ super.mediator.execute("123"); } }public class Client { public static void main(String[] args) { AbstractCandyMediator mediator = new ConcreteCandyMediator(); CandyPurchase candyPurchase = new CandyPurchase(mediator); candyPurchase.buyCandy(666); CandySale candySale = new CandySale(mediator); candySale.saleCandy(20); CandyStock candyStock = new CandyStock(mediator); candyStock.clearStock(); } }經(jīng)過改造,我們發(fā)現(xiàn)每個(gè)類都只與中介者是朋友類,耦合降低,每個(gè)類只處理自己的職責(zé),和其他類有關(guān)的統(tǒng)統(tǒng)交給中介者。
中介者模式的應(yīng)用中介者模式的優(yōu)點(diǎn)就是減少類間的依賴,將一對多的依賴變成一對一的依賴,降低耦合,符合迪米特法則。缺點(diǎn)就是中介者會變得異常龐大,邏輯復(fù)雜,同事類越多,中介者的邏輯就越復(fù)雜。中介者模式適用于多個(gè)對象之間出現(xiàn)緊密聯(lián)系,類圖成網(wǎng)狀結(jié)構(gòu),使用中介者模式可以梳理為星型結(jié)構(gòu),有助于理解其關(guān)系。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68200.html
摘要:好,師傅我們要學(xué)習(xí)帝吧人民,進(jìn)能打,退能刷淘寶。恩,大致過程就是這樣,我們使用中介者模式想一想。首先,數(shù)據(jù)需要放在中介者模式內(nèi),用戶的一切操作,都會傳遞給中介者模式,由他來選擇是哪一個(gè)部分發(fā)生改變。 俗話說,一個(gè)模式三個(gè)坑。 中介者模式應(yīng)該算最坑的一個(gè)模式,坑不在于他的原理。而在于他的名字和其他模式的使用,真尼瑪像。首先,中介者 好像是一切模式里面都有的一個(gè)東西,比如,享元模式中-元對...
摘要:用中介者模式實(shí)現(xiàn)土豆饅頭豆包地瓜土豆饅頭豆包地瓜土豆饅頭輸出缺陷使用中介者模式可以很大程度上避免對象之間的相互影響,無論是對于代碼的可讀性以及邏輯性都可以簡化。 中介者模式 我們知道在程序中各個(gè)對象之間并不是完全獨(dú)立的,相互之間是可能存在關(guān)系的,并且可能會相互影響的,就像這樣。 showImg(https://segmentfault.com/img/bVJ8wK?w=428&h=51...
摘要:中介者模式中介者模式對象和對象之間借助第三方中介者進(jìn)行通信。將就用下這個(gè)這個(gè)函數(shù)充當(dāng)中介者挑戰(zhàn)成功挑戰(zhàn)失敗選手選手選手選手挑戰(zhàn)成功選手挑戰(zhàn)成功選手挑戰(zhàn)失敗在這段代碼中之間沒有直接發(fā)生關(guān)系而是通過另外的對象建立鏈接姑且將之當(dāng)成是中介者模式了。 中介者模式 中介者模式: 對象和對象之間借助第三方中介者進(jìn)行通信。 showImg(https://segmentfault.com/img/bV...
摘要:在地球上最大的中介者就是聯(lián)合國了,它主要用來維護(hù)國際和平與安全解決國際間經(jīng)濟(jì)社會文化和人道主義性質(zhì)的問題。所以對于關(guān)系比較復(fù)雜的系統(tǒng),我們?yōu)榱藴p少對象之間的關(guān)聯(lián)關(guān)系,使之成為一個(gè)松耦合系統(tǒng),我們就需要使用中介者模式。 中介者模式(Mediator Pattern)屬于行為型模式的一種,用一個(gè)中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)...
摘要:推文用設(shè)計(jì)模式解構(gòu)三國是一種什么體驗(yàn)行為型設(shè)計(jì)模式一策略模式工廠模式優(yōu)化結(jié)構(gòu)狀態(tài)模式隨著狀態(tài)改變而改變行為。推文狀態(tài)機(jī)與狀態(tài)模式責(zé)任鏈模式多個(gè)對象依次處理請求前者指定后者。代理模式代理針對一個(gè)對象,為了增加控制等中介雙方都是多個(gè),為了解耦。 策略模式 選擇使用封裝好的一系列算法,可相互替換。 類比:商店[Context]買完衣服買單[Stratege](現(xiàn)金[Concrete Stra...
閱讀 1808·2021-09-03 10:50
閱讀 1339·2019-08-30 15:55
閱讀 3381·2019-08-30 15:52
閱讀 1242·2019-08-30 15:44
閱讀 954·2019-08-30 15:44
閱讀 3326·2019-08-30 14:23
閱讀 3559·2019-08-28 17:51
閱讀 2298·2019-08-26 13:52