亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java設(shè)計(jì)模式之中介者模式

 更新時(shí)間:2021年09月15日 11:08:42   作者:hanqing280441589  
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之中介者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

中介者模式

面向?qū)ο笤O(shè)計(jì)鼓勵(lì)將行為分布到各個(gè)對(duì)象中, 這種分布可能會(huì)導(dǎo)致對(duì)象間有許多連接. 在最壞的情況下, 每一個(gè)對(duì)象都需要知道其他所有對(duì)象.

雖然將一個(gè)系統(tǒng)分割成許多對(duì)象可增強(qiáng)可復(fù)用性, 但是對(duì)象間相互連接的激增又會(huì)降低其可復(fù)用性. 大量的連接關(guān)系使得一個(gè)對(duì)象不可能在沒(méi)有其他對(duì)象的協(xié)助下工作(系統(tǒng)表現(xiàn)為一個(gè)不可分割的整體), 此時(shí)再對(duì)系統(tǒng)行為進(jìn)行任何較大改動(dòng)就十分困難. 因?yàn)樾袨楸环植荚谠S多對(duì)象中, 結(jié)果是不得不定義很多子類(lèi)以定制系統(tǒng)的行為. 由此我們引入了中介者對(duì)象Mediator:

通過(guò)中介者對(duì)象, 可以將網(wǎng)狀結(jié)構(gòu)的系統(tǒng)改造成以中介者為中心的星型結(jié)構(gòu), 每個(gè)具體對(duì)象不再與另一個(gè)對(duì)象直接發(fā)生關(guān)系, 而是通過(guò)中介者對(duì)象從中調(diào)停.中介者對(duì)象的引入,也使得系統(tǒng)結(jié)構(gòu)不會(huì)因新對(duì)象的引入造成大量的修改.

中介者模式: 又稱(chēng)調(diào)停者模式, 用一個(gè)中介者對(duì)象(Mediator)來(lái)封裝一系列對(duì)象的交互, 使各對(duì)象不需再顯示地相互引用, 從而使耦合松散, 而且可以獨(dú)立地改變他們之間的交互:

(圖片來(lái)源: 設(shè)計(jì)模式: 可復(fù)用面向?qū)ο筌浖幕A(chǔ))Tips: 各Colleague只知道Mediator的存在, 并不需要知道其他Colleague是否存在(不然怎么解耦呢), 它只需將消息發(fā)送給Mediator, 然后由Mediator轉(zhuǎn)發(fā)給其他Colleague(由Mediator存儲(chǔ)所有Colleague關(guān)系, 也只有Mediator知道有多少/哪些Colleague).

模式實(shí)現(xiàn)

聯(lián)合國(guó)轉(zhuǎn)發(fā)各國(guó)聲明, 調(diào)停各國(guó)關(guān)系:
各國(guó)向聯(lián)合國(guó)安理會(huì)發(fā)送和接收消息, 安理會(huì)在各國(guó)間'適當(dāng)?shù)?轉(zhuǎn)發(fā)請(qǐng)求以實(shí)現(xiàn)協(xié)作行為:

Colleague

抽象同事類(lèi), 定義各同事的公有方法:

/**
 * @author jifang
 * @since 16/8/28 下午4:22.
 */
public abstract class Country {

 protected UnitedNations mediator;

 private String name;

 public Country(UnitedNations mediator, String name) {
  this.mediator = mediator;
  this.name = name;
 }

 public String getName() {
  return name;
 }

 protected abstract void declare(String msg);

 protected abstract void receive(String msg);
}

--------------------------------------------------------------------------------

ConcreteColleague

具體同事類(lèi):
 •每一個(gè)同事類(lèi)都知道它的中介者對(duì)象.
 •每一個(gè)同事對(duì)象在需與其他同事通信時(shí), 與它的中介者通信. 

class USA extends Country {

 public USA(UnitedNations mediator, String name) {
  super(mediator, name);
 }

 @Override
 public void declare(String msg) {
  mediator.declare(this, msg);
 }

 @Override
 public void receive(String msg) {
  System.out.println("美國(guó)接收到: [" + msg + "]");
 }
}

class Iraq extends Country {

 public Iraq(UnitedNations mediator, String name) {
  super(mediator, name);
 }

 @Override
 public void declare(String msg) {
  mediator.declare(this, msg);
 }

 @Override
 public void receive(String msg) {
  System.out.println("伊拉克接收到: [" + msg + "]");
 }
}

class China extends Country {

 public China(UnitedNations mediator, String name) {
  super(mediator, name);
 }

 @Override
 public void declare(String msg) {
  mediator.declare(this, msg);
 }

 @Override
 public void receive(String msg) {
  System.out.println("中國(guó)接收到: [" + msg + "]");
 }
}

--------------------------------------------------------------------------------

Mediator

抽象中介者: 定義一個(gè)接口用于與各同事對(duì)象通信:

public abstract class UnitedNations {

 protected List<Country> countries = new LinkedList<>();

 public void register(Country country) {
  countries.add(country);
 }

 public void remove(Country country) {
  countries.remove(country);
 }

 protected abstract void declare(Country country, String msg);
}

--------------------------------------------------------------------------------

ConcreteMediator

具體中介者:
•了解并維護(hù)它的各個(gè)同事;
 •通過(guò)協(xié)調(diào)各同事對(duì)象實(shí)現(xiàn)協(xié)作行為(從同事接收消息, 向具體同事發(fā)出命令). 

class UnitedNationsSecurityCouncil extends UnitedNations {

 /**
  * 安理會(huì)在中間作出調(diào)停
  *
  * @param country
  * @param msg
  */
 @Override
 protected void declare(Country country, String msg) {
  for (Country toCountry : countries) {
   if (!toCountry.equals(country)) {
    String name = country.getName();
    toCountry.receive(name + "平和的說(shuō): " + msg);
   }
  }
 }
}

如果不存在擴(kuò)展情況, 那么Mediator可與ConcreteMediator合二為一.
 •Client 

public class Client {

 @Test
 public void client() {
  UnitedNations mediator = new UnitedNationsSecurityCouncil();

  Country usa = new USA(mediator, "美國(guó)");
  Country china = new China(mediator, "中國(guó)");
  Country iraq = new Iraq(mediator, "伊拉克");

  mediator.register(usa);
  mediator.register(china);
  mediator.register(iraq);

  usa.declare("我要打伊拉克, 誰(shuí)管我跟誰(shuí)急!!!");
  System.out.println("----------");
  china.declare("我們強(qiáng)烈譴責(zé)!!!");
  System.out.println("----------");
  iraq.declare("來(lái)呀, 來(lái)互相傷害呀!!!");
 }
}

小結(jié)

Mediator的出現(xiàn)減少了各Colleague之間的耦合, 使得可以獨(dú)立改變和復(fù)用各Colleague和Mediator, 由于把對(duì)象如何協(xié)作進(jìn)行了抽象、將中介作為一個(gè)獨(dú)立的概念并將其封裝在一個(gè)對(duì)象中, 這樣關(guān)注的焦點(diǎn)就從對(duì)象各自本身的行為轉(zhuǎn)移到它們之間的交互上來(lái), 從而可以站在一個(gè)更宏觀的角度去看待系統(tǒng).

 •適用性

中介者模式很容易在系統(tǒng)中應(yīng)用, 也很容易在系統(tǒng)中誤用. 當(dāng)系統(tǒng)出現(xiàn)了“多對(duì)多”交互復(fù)雜的對(duì)象群時(shí), 不要急于使用中介者, 最好首先先反思系統(tǒng)的設(shè)計(jì)是否是合理. 由于ConcreteMediator控制了集中化, 于是就把交互復(fù)雜性變成了中介者的復(fù)雜性, 使得中介者變得比任一個(gè)ConcreteColleague都復(fù)雜. 在下列情況下建議使用中介者模式:

◦一組對(duì)象以定義良好但復(fù)雜的方式進(jìn)行通信. 產(chǎn)生的相互依賴(lài)關(guān)系結(jié)構(gòu)混亂且難以理解.
◦一個(gè)對(duì)象引用其他很多對(duì)象并且直接與這些對(duì)象通信, 導(dǎo)致難以復(fù)用該對(duì)象.
◦想定制一個(gè)分布在多個(gè)類(lèi)中的行為, 而又不想生成太多的子類(lèi).

•相關(guān)模式

◦Facade與中介者的不同之處在于它是對(duì)一個(gè)對(duì)象子系統(tǒng)進(jìn)行抽象, 從而提供了一個(gè)更為方便的接口, 它的協(xié)議是單向的, 即Facade對(duì)象對(duì)這個(gè)子系統(tǒng)類(lèi)提出請(qǐng)求, 但反之則不可. 相反, Mediator提供了各Colleague對(duì)象不支持或不能支持的協(xié)作行為, 而且協(xié)議是多向的.
◦Colleague可使用Observer模式與Mediator通信.

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot系列教程之死信隊(duì)列詳解

    Spring Boot系列教程之死信隊(duì)列詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot系列教程之死信隊(duì)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Mybatis 緩存原理及失效情況解析

    Mybatis 緩存原理及失效情況解析

    這篇文章主要介紹了Mybatis 緩存原理及失效情況解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解Java面向?qū)ο笾鄳B(tài)的原理與實(shí)現(xiàn)

    詳解Java面向?qū)ο笾鄳B(tài)的原理與實(shí)現(xiàn)

    多態(tài)是指不同的子類(lèi)在繼承父類(lèi)后分別都重寫(xiě)覆蓋了父類(lèi)的方法,即父類(lèi)同一個(gè)方法,在繼承的子類(lèi)中表現(xiàn)出不同的形式。本文將詳解多態(tài)的原理與實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • 淺談一下Java中枚舉的用法

    淺談一下Java中枚舉的用法

    這篇文章主要介紹了淺談一下Java中枚舉的用法,枚舉是一個(gè)被命名的整型常數(shù)的集合,用于聲明一組帶標(biāo)識(shí)符的常數(shù),當(dāng)一個(gè)變量有幾種固定可能的取值時(shí),就可以將它定義為枚舉類(lèi)型,需要的朋友可以參考下
    2023-04-04
  • Java高并發(fā)測(cè)試框架JCStress詳解

    Java高并發(fā)測(cè)試框架JCStress詳解

    這篇文章主要介紹了Java高并發(fā)測(cè)試框架JCStress,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • lambda表達(dá)式解決java后臺(tái)分組排序過(guò)程解析

    lambda表達(dá)式解決java后臺(tái)分組排序過(guò)程解析

    這篇文章主要介紹了lambda表達(dá)式解決java后臺(tái)分組排序過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn)

    mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn)

    XML 文件在解析時(shí)會(huì)將五種特殊字符進(jìn)行轉(zhuǎn)義,本文主要介紹了mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • MyBatis與SpringMVC相結(jié)合實(shí)現(xiàn)文件上傳、下載功能

    MyBatis與SpringMVC相結(jié)合實(shí)現(xiàn)文件上傳、下載功能

    這篇文章主要介紹了MyBatis與SpringMVC相結(jié)合實(shí)現(xiàn)文件上傳、下載功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • java生成jar包的方法

    java生成jar包的方法

    這篇文章主要介紹了java生成jar包的方法,對(duì)Java生成jar包的具體步驟及方法進(jìn)行了較為詳細(xì)的描述,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • springboot+thymeleaf找不到視圖的解決方案

    springboot+thymeleaf找不到視圖的解決方案

    這篇文章主要介紹了springboot+thymeleaf找不到視圖的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論