亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

23種設計模式(20)java中介者模式

2024-07-13 10:17:24
字體:
來源:轉載
供稿:網友

23種設計模式第二十篇:java中介者模式

定義:用一個中介者對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使耦合松散,而且可以獨立地改變它們之間的交互。

類型:行為類模式

類圖:

java,中介者模式

中介者模式的結構

中介者模式又稱為調停者模式,從類圖中看,共分為3部分:

抽象中介者:定義好同事類對象到中介者對象的接口,用于各個同事類之間的通信。一般包括一個或幾個抽象的事件方法,并由子類去實現。

中介者實現類:從抽象中介者繼承而來,實現抽象中介者中定義的事件方法。從一個同事類接收消息,然后通過消息影響其他同時類。

同事類:如果一個對象會影響其他的對象,同時也會被其他對象影響,那么這兩個對象稱為同事類。在類圖中,同事類只有一個,這其實是現實的省略,在實際應用中,同事類一般由多個組成,他們之間相互影響,相互依賴。同事類越多,關系越復雜。并且,同事類也可以表現為繼承了同一個抽象類的一組實現組成。在中介者模式中,同事類之間必須通過中介者才能進行消息傳遞。

為什么要使用中介者模式

       一般來說,同事類之間的關系是比較復雜的,多個同事類之間互相關聯時,他們之間的關系會呈現為復雜的網狀結構,這是一種過度耦合的架構,即不利于類的復用,也不穩定。例如在下圖中,有六個同事類對象,假如對象1發生變化,那么將會有4個對象受到影響。如果對象2發生變化,那么將會有5個對象受到影響。也就是說,同事類之間直接關聯的設計是不好的。

java,中介者模式

如果引入中介者模式,那么同事類之間的關系將變為星型結構,從圖中可以看到,任何一個類的變動,只會影響的類本身,以及中介者,這樣就減小了系統的耦合。一個好的設計,必定不會把所有的對象關系處理邏輯封裝在本類中,而是使用一個專門的類來管理那些不屬于自己的行為。

java,中介者模式

我們使用一個例子來說明一下什么是同事類:有兩個類A和B,類中各有一個數字,并且要保證類B中的數字永遠是類A中數字的100倍。也就是說,當修改類A的數時,將這個數字乘以100賦給類B,而修改類B時,要將數除以100賦給類A。類A類B互相影響,就稱為同事類。代碼如下:

abstract class AbstractColleague {   protected int number;    public int getNumber() {     return number;   }    public void setNumber(int number){     this.number = number;   }   //抽象方法,修改數字時同時修改關聯對象   public abstract void setNumber(int number, AbstractColleague coll); }  class ColleagueA extends AbstractColleague{   public void setNumber(int number, AbstractColleague coll) {     this.number = number;     coll.setNumber(number*100);   } }  class ColleagueB extends AbstractColleague{      public void setNumber(int number, AbstractColleague coll) {     this.number = number;     coll.setNumber(number/100);   } }  public class Client {   public static void main(String[] args){      AbstractColleague collA = new ColleagueA();     AbstractColleague collB = new ColleagueB();          System.out.println("==========設置A影響B==========");     collA.setNumber(1288, collB);     System.out.println("collA的number值:"+collA.getNumber());     System.out.println("collB的number值:"+collB.getNumber());      System.out.println("==========設置B影響A==========");     collB.setNumber(87635, collA);     System.out.println("collB的number值:"+collB.getNumber());     System.out.println("collA的number值:"+collA.getNumber());   } }

上面的代碼中,類A類B通過直接的關聯發生關系,假如我們要使用中介者模式,類A類B之間則不可以直接關聯,他們之間必須要通過一個中介者來達到關聯的目的。

abstract class AbstractColleague {   protected int number;    public int getNumber() {     return number;   }    public void setNumber(int number){     this.number = number;   }   //注意這里的參數不再是同事類,而是一個中介者   public abstract void setNumber(int number, AbstractMediator am); }  class ColleagueA extends AbstractColleague{    public void setNumber(int number, AbstractMediator am) {     this.number = number;     am.AaffectB();   } }  class ColleagueB extends AbstractColleague{    @Override   public void setNumber(int number, AbstractMediator am) {     this.number = number;     am.BaffectA();   } }  abstract class AbstractMediator {   protected AbstractColleague A;   protected AbstractColleague B;      public AbstractMediator(AbstractColleague a, AbstractColleague b) {     A = a;     B = b;   }    public abstract void AaffectB();      public abstract void BaffectA();  } class Mediator extends AbstractMediator {    public Mediator(AbstractColleague a, AbstractColleague b) {     super(a, b);   }    //處理A對B的影響   public void AaffectB() {     int number = A.getNumber();     B.setNumber(number*100);   }    //處理B對A的影響   public void BaffectA() {     int number = B.getNumber();     A.setNumber(number/100);   } }  public class Client {   public static void main(String[] args){     AbstractColleague collA = new ColleagueA();     AbstractColleague collB = new ColleagueB();          AbstractMediator am = new Mediator(collA, collB);          System.out.println("==========通過設置A影響B==========");     collA.setNumber(1000, am);     System.out.println("collA的number值為:"+collA.getNumber());     System.out.println("collB的number值為A的10倍:"+collB.getNumber());      System.out.println("==========通過設置B影響A==========");     collB.setNumber(1000, am);     System.out.println("collB的number值為:"+collB.getNumber());     System.out.println("collA的number值為B的0.1倍:"+collA.getNumber());        } }

雖然代碼比較長,但是還是比較容易理解的,其實就是把原來處理對象關系的代碼重新封裝到一個中介類中,通過這個中介類來處理對象間的關系。

中介者模式的優點

1、適當地使用中介者模式可以避免同事類之間的過度耦合,使得各同事類之間可以相對獨立地使用。
2、使用中介者模式可以將對象間一對多的關聯轉變為一對一的關聯,使對象間的關系易于理解和維護。
3、使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用。

適用場景

       在面向對象編程中,一個類必然會與其他的類發生依賴關系,完全獨立的類是沒有意義的。一個類同時依賴多個類的情況也相當普遍,既然存在這樣的情況,說明,一對多的依賴關系有它的合理性,適當的使用中介者模式可以使原本凌亂的對象關系清晰,但是如果濫用,則可能會帶來反的效果。一般來說,只有對于那種同事類之間是網狀結構的關系,才會考慮使用中介者模式??梢詫⒕W狀結構變為星狀結構,使同事類之間的關系變的清晰一些。

       中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對于大多數的情況,同事類之間的關系不會復雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關系封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产成人久久综合一区| 欧美激情精品久久久久久大尺度| 日韩在线观看免费全集电视剧网站| 国产精品啪视频| 欧美极品少妇xxxxⅹ裸体艺术| 国产v综合v亚洲欧美久久| 久久99精品久久久久久青青91| 亚洲精品国产精品久久清纯直播| 欧美日韩性生活视频| 欧美激情xxxxx| 国产偷亚洲偷欧美偷精品| 国产精品视频地址| 俺去啦;欧美日韩| 欧美乱大交xxxxx| 国产精品一区二区久久久久| 国产亚洲欧洲黄色| 精品中文字幕在线| 日韩精品中文字幕在线| 91精品国产91久久久久福利| 欧美激情videoshd| 国内精品久久久久伊人av| 国产精品久久久久久亚洲调教| 亚洲国产精品成人精品| 亚洲美腿欧美激情另类| 一区二区在线免费视频| 久久91超碰青草是什么| 欧美日韩中文字幕在线视频| 亚洲女人天堂成人av在线| 成人网在线视频| 精品亚洲一区二区三区在线观看| 国产欧美一区二区白浆黑人| 欧美色视频日本版| 久久精视频免费在线久久完整在线看| 91免费精品国偷自产在线| 亚洲欧洲国产精品| 欧美日韩一区二区在线| 日韩在线视频观看正片免费网站| 中文字幕精品av| 亚洲japanese制服美女| 亚洲成色777777在线观看影院| 日韩在线观看成人| 懂色aⅴ精品一区二区三区蜜月| 黑人巨大精品欧美一区二区三区| 国产亚洲aⅴaaaaaa毛片| 欧美激情久久久| 日本一区二区在线免费播放| 欧美电影免费观看高清| 亚洲视频777| 欧美最近摘花xxxx摘花| 日韩免费在线看| 亚洲天堂免费视频| 精品亚洲一区二区三区在线播放| 最新国产精品亚洲| 欧亚精品中文字幕| 性欧美长视频免费观看不卡| 国产精品福利网站| 少妇精69xxtheporn| 91亚洲一区精品| 亚洲精品永久免费| 国产三级精品网站| 国产女精品视频网站免费| 国产亚洲福利一区| 国产区精品在线观看| 国产精品久久久久一区二区| 97国产精品人人爽人人做| 亚洲第一精品夜夜躁人人躁| 中文字幕在线日韩| 国产一区二区香蕉| 亚洲天堂av在线免费观看| 97超碰国产精品女人人人爽| 国产精品成人观看视频国产奇米| 2019亚洲日韩新视频| 亚洲理论片在线观看| 久久久久久九九九| 国产日韩欧美日韩大片| 91高清免费在线观看| 欧美色视频日本高清在线观看| 日本视频久久久| 欧美一区二区三区免费观看| 91色视频在线观看| 国产精品27p| 国产亚洲欧洲高清一区| 青青久久aⅴ北条麻妃| 日本一区二区不卡| 97国产精品视频| 亚洲色图综合久久| 亚洲aaaaaa| 久久久久久12| 色在人av网站天堂精品| 亚洲欧美日本伦理| 欧美俄罗斯乱妇| 欧美日韩免费一区| 亚洲人成啪啪网站| 国产91色在线|| 日韩av电影在线免费播放| www欧美日韩| 日韩视频―中文字幕| 欧美大片免费观看在线观看网站推荐| 国产精品亚洲视频在线观看| 热草久综合在线| 一区二区三区黄色| 国产精品男女猛烈高潮激情| 欧美精品免费播放| 国产精品久久久久久久美男| 亚洲在线视频福利| 亚洲影院在线看| 精品动漫一区二区三区| 国产中文字幕亚洲| 欧美精品一本久久男人的天堂| 久久精品久久久久| 国产精品中文久久久久久久| 精品久久国产精品| 日产精品99久久久久久| 久久精品一本久久99精品| 欧美午夜精品久久久久久浪潮| 亚洲一区二区中文字幕| 国产精品中文字幕在线观看| 国产在线精品一区免费香蕉| 色诱女教师一区二区三区| 91亚洲一区精品| 综合激情国产一区| 性色av一区二区三区| 日韩中文字幕不卡视频| 欧美日韩亚洲精品内裤| 韩国视频理论视频久久| 国产精品国产亚洲伊人久久| 国产美女久久精品香蕉69| 红桃视频成人在线观看| 91在线中文字幕| 精品视频在线播放| 欧美日韩久久久久| 国产精品免费一区豆花| 精品国产欧美一区二区五十路| 91久久在线视频| 美女av一区二区| 久久99精品久久久久久噜噜| 日韩69视频在线观看| 国产精品96久久久久久又黄又硬| 日韩精品中文字幕久久臀| 久久精品国产亚洲| 91av在线精品| 亚洲成人精品久久| 国产不卡精品视男人的天堂| 亚洲老头老太hd| 欧美高清第一页| 第一福利永久视频精品| 国产91在线播放精品91| 国产精品视频一| 亚洲国产另类 国产精品国产免费| 在线看片第一页欧美| 国产成人精品久久二区二区91| 国产亚洲精品久久久久动| 亚洲最大的av网站| 欧美激情久久久| 欧美激情视频在线观看| 98精品国产高清在线xxxx天堂| 91国内在线视频| 日韩av免费在线看| 国产在线观看91精品一区| 成人性生交大片免费观看嘿嘿视频| 91国产精品电影| 欧美午夜激情小视频| 777国产偷窥盗摄精品视频| 久久97久久97精品免视看|