一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java設計模式之中介者模式

java設計模式之中介者模式

2020-06-08 12:29hanqing280441589 JAVA教程

這篇文章主要為大家詳細介紹了java設計模式之中介者模式,感興趣的小伙伴們可以參考一下

中介者模式

面向對象設計鼓勵將行為分布到各個對象中, 這種分布可能會導致對象間有許多連接. 在最壞的情況下, 每一個對象都需要知道其他所有對象.

雖然將一個系統分割成許多對象可增強可復用性, 但是對象間相互連接的激增又會降低其可復用性. 大量的連接關系使得一個對象不可能在沒有其他對象的協助下工作(系統表現為一個不可分割的整體), 此時再對系統行為進行任何較大改動就十分困難. 因為行為被分布在許多對象中, 結果是不得不定義很多子類以定制系統的行為. 由此我們引入了中介者對象Mediator:

java設計模式之中介者模式

通過中介者對象, 可以將網狀結構的系統改造成以中介者為中心的星型結構, 每個具體對象不再與另一個對象直接發生關系, 而是通過中介者對象從中調停.中介者對象的引入,也使得系統結構不會因新對象的引入造成大量的修改.

中介者模式: 又稱調停者模式, 用一個中介者對象(Mediator)來封裝一系列對象的交互, 使各對象不需再顯示地相互引用, 從而使耦合松散, 而且可以獨立地改變他們之間的交互:

java設計模式之中介者模式

(圖片來源: 設計模式: 可復用面向對象軟件的基礎)Tips: 各Colleague只知道Mediator的存在, 并不需要知道其他Colleague是否存在(不然怎么解耦呢), 它只需將消息發送給Mediator, 然后由Mediator轉發給其他Colleague(由Mediator存儲所有Colleague關系, 也只有Mediator知道有多少/哪些Colleague).

模式實現

聯合國轉發各國聲明, 調停各國關系:
各國向聯合國安理會發送和接收消息, 安理會在各國間'適當地'轉發請求以實現協作行為:

java設計模式之中介者模式

Colleague

抽象同事類, 定義各同事的公有方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * @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

具體同事類:
 •每一個同事類都知道它的中介者對象.
 •每一個同事對象在需與其他同事通信時, 與它的中介者通信. 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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("美國接收到: [" + 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("中國接收到: [" + msg + "]");
 }
}

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

Mediator

抽象中介者: 定義一個接口用于與各同事對象通信:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

具體中介者:
•了解并維護它的各個同事;
 •通過協調各同事對象實現協作行為(從同事接收消息, 向具體同事發出命令). 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class UnitedNationsSecurityCouncil extends UnitedNations {
 
 /**
  * 安理會在中間作出調停
  *
  * @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 + "平和的說: " + msg);
   }
  }
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Client {
 
 @Test
 public void client() {
  UnitedNations mediator = new UnitedNationsSecurityCouncil();
 
  Country usa = new USA(mediator, "美國");
  Country china = new China(mediator, "中國");
  Country iraq = new Iraq(mediator, "伊拉克");
 
  mediator.register(usa);
  mediator.register(china);
  mediator.register(iraq);
 
  usa.declare("我要打伊拉克, 誰管我跟誰急!!!");
  System.out.println("----------");
  china.declare("我們強烈譴責!!!");
  System.out.println("----------");
  iraq.declare("來呀, 來互相傷害呀!!!");
 }
}

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

 小結

Mediator的出現減少了各Colleague之間的耦合, 使得可以獨立改變和復用各Colleague和Mediator, 由于把對象如何協作進行了抽象、將中介作為一個獨立的概念并將其封裝在一個對象中, 這樣關注的焦點就從對象各自本身的行為轉移到它們之間的交互上來, 從而可以站在一個更宏觀的角度去看待系統.

 •適用性
中介者模式很容易在系統中應用, 也很容易在系統中誤用. 當系統出現了“多對多”交互復雜的對象群時, 不要急于使用中介者, 最好首先先反思系統的設計是否是合理. 由于ConcreteMediator控制了集中化, 于是就把交互復雜性變成了中介者的復雜性, 使得中介者變得比任一個ConcreteColleague都復雜. 在下列情況下建議使用中介者模式:
?一組對象以定義良好但復雜的方式進行通信. 產生的相互依賴關系結構混亂且難以理解.
 ?一個對象引用其他很多對象并且直接與這些對象通信, 導致難以復用該對象.
 ?想定制一個分布在多個類中的行為, 而又不想生成太多的子類.

•相關模式
?Facade與中介者的不同之處在于它是對一個對象子系統進行抽象, 從而提供了一個更為方便的接口, 它的協議是單向的, 即Facade對象對這個子系統類提出請求, 但反之則不可. 相反, Mediator提供了各Colleague對象不支持或不能支持的協作行為, 而且協議是多向的.
 ?Colleague可使用Observer模式與Mediator通信.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产91区| 青青草色 | 日韩欧美国产综合精品 | 青青热久免费精品视频精品 | 色综合综合 | 欧美三级小视频 | 俺去也亚洲色图 | 久久re视频这里精品一本到99 | 亚洲午夜大片 | 天天综合色天天综合 | 天天草天天 | 国产人人草 | 99ri在线精品视频 | 亚洲小视频网站 | 亚洲成人伦理 | 午夜一区二区三区 | 亚洲人成网站在线观看播放青青 | 精品国语国产在线对白 | 国亚洲欧美日韩精品 | 日韩欧美一区二区三区中文精品 | 不卡视频一区二区 | a级免费在线观看 | 九九精品视频一区二区三区 | 青草热视频 | 99午夜 | 国产区小视频 | 色就色欧美综合偷拍区a | 日韩一品在线播放视频一品免费 | 色天使亚洲综合在线观看 | 朝鲜女人性猛交 | 小sao货水好多真紧h的视频 | 日本高清有码视频 | 桃乃木香奈作品在线观看 | 思敏1一5集国语版免费观看 | 奇米影视中文字幕 | 99亚洲 | 久久内在线视频精品mp4 | 色综合网天天综合色中文男男 | 亚洲欧美久久一区二区 | japanese秘书丝袜 | 小寡妇好紧进去了好大看视频 |