国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 23種設計模式(20)java中介者模式

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

2021-03-27 14:03Java知音 Java教程

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

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

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

類型:行為類模式

類圖:

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

中介者模式的結構

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

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

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

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

為什么要使用中介者模式

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

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

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

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

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

?
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
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之間則不可以直接關聯,他們之間必須要通過一個中介者來達到關聯的目的。

?
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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、使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用。

適用場景

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

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产高清一区二区三区 | 国产精品亚洲精品 | 日韩在线观看中文字幕 | 在线精品国产 | 黄色美女网站免费 | 性欧美精品久久久久久久 | 在线欧美亚洲 | 免费 成 人 黄 色 | 欧美a视频 | www久| 亚洲一页 | 精品av| 九九人人 | 日韩在线资源 | 欧州一区二区三区 | 亚洲在线观看免费视频 | 成人久久久| 中文字幕亚洲一区二区va在线 | 国产av毛片 | 欧美一级网站 | 国产成人在线看 | 中文字幕视频在线观看 | 欧美中文一区二区三区 | 国产综合久久久 | 国产欧美日韩综合精品一区二区 | 久久一区二区三 | 成人精品视频 | 婷婷综合在线 | 亚洲精品一二三区 | 日本一区二区在线视频 | 午夜午夜精品一区二区三区文 | 黄色一级毛片免费看 | 欧美日韩精品一区二区在线播放 | 亚洲精品乱码8久久久久久日本 | 日本全黄裸体片 | 成人午夜毛片 | 日韩精品免费在线观看 | 国产欧美综合一区二区三区 | 国内精品久久久久 | 一区二区三区高清不卡 | 欧美日韩在线综合 |