軟件設(shè)計(jì)模式:SDP04-05中介者模式_第1頁(yè)
軟件設(shè)計(jì)模式:SDP04-05中介者模式_第2頁(yè)
軟件設(shè)計(jì)模式:SDP04-05中介者模式_第3頁(yè)
軟件設(shè)計(jì)模式:SDP04-05中介者模式_第4頁(yè)
軟件設(shè)計(jì)模式:SDP04-05中介者模式_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、中介者模式中介者模式n 模式動(dòng)機(jī)與定義n 模式結(jié)構(gòu)與分析n 模式實(shí)例與解析n 模式效果與應(yīng)用n 模式擴(kuò)展中介者模式模式動(dòng)機(jī)n在QQ聊天中,一般有兩種聊天方式:第一種是用戶與用戶直接聊天,第二種是通過QQ群聊天。n一個(gè)用戶如果要與別的用戶聊天或發(fā)送文件,通常需要加其他用戶為好友,一個(gè)用戶如果要將相同的信息或文件發(fā)送給其他所有用戶,必須一個(gè)一個(gè)的發(fā)送。n如果使用QQ群,一個(gè)用戶就可以向多個(gè)用戶發(fā)送相同的信息和文件而無(wú)須一一進(jìn)行發(fā)送。n群的作用就是將發(fā)送者所發(fā)送的信息和文件轉(zhuǎn)發(fā)給每一個(gè)接收者用戶。中介者模式模式動(dòng)機(jī)中介者模式模式動(dòng)機(jī)n通過引入群的機(jī)制,將極大減少系統(tǒng)中用戶之間的兩兩通信,用戶與多個(gè)用

2、戶之間的聯(lián)系可以通過群來實(shí)現(xiàn)。n在有些軟件中,某些類/對(duì)象之間的相互調(diào)用關(guān)系錯(cuò)綜復(fù)雜,類似QQ用戶之間的關(guān)系,此時(shí),我們特別需要一個(gè)類似“QQ群”一樣的中間類來協(xié)調(diào)這些類/對(duì)象之間的復(fù)雜關(guān)系,以降低系統(tǒng)的耦合度。有一個(gè)設(shè)計(jì)模式正為此而誕生,它就是將要介紹的中介者模式。中介者模式模式動(dòng)機(jī)n如果在一個(gè)系統(tǒng)中對(duì)象之間的聯(lián)系呈現(xiàn)為網(wǎng)狀結(jié)構(gòu),如圖所示。對(duì)象之間存在大量的多對(duì)多聯(lián)系,將導(dǎo)致系統(tǒng)非常復(fù)雜,這些對(duì)象既會(huì)影響別的對(duì)象,也會(huì)被別的對(duì)象所影響,這些對(duì)象稱為同事對(duì)象同事對(duì)象,它們之間通過彼此的相互作用實(shí)現(xiàn)系統(tǒng)的行為。在網(wǎng)狀結(jié)構(gòu)中,幾乎每個(gè)對(duì)象都需要與其他對(duì)象發(fā)生相互作用,而這種相互作用表現(xiàn)為一個(gè)對(duì)象與

3、另外一個(gè)對(duì)象的直接耦合,這將導(dǎo)致一個(gè)過度耦合的系統(tǒng)。新對(duì)象的引入將帶來大量的修改工作。中介者模式模式動(dòng)機(jī)對(duì)象之間存在復(fù)雜關(guān)系的網(wǎng)狀結(jié)構(gòu)對(duì)象之間存在復(fù)雜關(guān)系的網(wǎng)狀結(jié)構(gòu) 中介者模式模式動(dòng)機(jī)n如果在一個(gè)系統(tǒng)中對(duì)象之間存在多對(duì)多的相互關(guān)系,我們可以將對(duì)象之間的一些交互行為從各個(gè)對(duì)象中分離出來,并集中封裝在一個(gè)中介者對(duì)象中介者對(duì)象中,并由該中介者進(jìn)行統(tǒng)一協(xié)調(diào),這樣對(duì)象之間多對(duì)多的復(fù)雜關(guān)系就轉(zhuǎn)化為相對(duì)簡(jiǎn)單的一對(duì)多關(guān)系??梢詫⑾到y(tǒng)的網(wǎng)狀結(jié)構(gòu)變成以中介者為中心的星形結(jié)構(gòu),如圖所示。在這個(gè)星形結(jié)構(gòu)中,同事對(duì)象不再直接與另一個(gè)對(duì)象聯(lián)系,它通過中介者對(duì)象與另一個(gè)對(duì)象發(fā)生相互作用。中介者模式是“迪米特法則”的一個(gè)典型

4、應(yīng)用。中介者模式模式動(dòng)機(jī)引入中介者對(duì)象的星型結(jié)構(gòu)引入中介者對(duì)象的星型結(jié)構(gòu) 中介者模式模式定義n中介者模式(Mediator Pattern)定義:用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式,它是一種對(duì)象行為型模式。中介者模式模式結(jié)構(gòu)mediatorMediatorColleagueConcreteColleagueAConcreteColleagueBConcreteMediator中介者模式中介者模式包含如下角色nMediator: 抽象中介者,它定義一個(gè)接口,該接口用于與各同事對(duì)象

5、之間進(jìn)行通信。nConcreteMediator: 具體中介者,它是抽象中介者的子類,通過協(xié)調(diào)各個(gè)同事對(duì)象來實(shí)現(xiàn)協(xié)作行為,它維持了對(duì)各個(gè)同事對(duì)象的引用。中介者模式中介者模式包含如下角色nColleague: 抽象同事類,它定義各個(gè)同事類公有的方法,并聲明了一些抽象方法來供子類實(shí)現(xiàn),同時(shí)它維持了一個(gè)對(duì)抽象中介者類的引用,其子類可以通過該引用來與中介者通信。nConcreteColleague: 具體同事類,它是抽象同事類的子類;每一個(gè)同事對(duì)象在需要和其他同事對(duì)象通信時(shí),先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實(shí)現(xiàn)了在抽象同事類中聲明的抽象方法。模式分析n模式的核心在

6、于中介者類的引入,它承擔(dān)兩方面職責(zé):n中轉(zhuǎn)作用(結(jié)構(gòu)性):通過中介者提供的中轉(zhuǎn)作用,各個(gè)同事對(duì)象就不再需要顯式引用其他同事,當(dāng)需要和其他同事進(jìn)行通信時(shí),可通過中介者來實(shí)現(xiàn)間接調(diào)用。該中轉(zhuǎn)作用屬于中介者在結(jié)構(gòu)上的支持。n協(xié)調(diào)作用(行為性):中介者可以更進(jìn)一步的對(duì)同事之間的關(guān)系進(jìn)行封裝,同事可以一致的和中介者進(jìn)行交互,而不需要指明中介者需要具體怎么做,中介者根據(jù)封裝在自身內(nèi)部的協(xié)調(diào)邏輯,對(duì)同事的請(qǐng)求進(jìn)行進(jìn)一步處理,將同事成員之間的關(guān)系行為進(jìn)行分離和封裝。該協(xié)調(diào)作用屬于中介者在行為上的支持。中介者模式模式分析n典型的抽象中介者類代碼:abstract class Mediator protected

7、 ArrayList colleagues; /用于存儲(chǔ)同事對(duì)象 /注冊(cè)方法,用于增加同事對(duì)象 public void register(Colleague colleague) colleagues.add(colleague); /聲明抽象的業(yè)務(wù)方法 public abstract void operation(); 在抽象中介者中可以定義一個(gè)在抽象中介者中可以定義一個(gè)同事類的集合,用于存儲(chǔ)同事同事類的集合,用于存儲(chǔ)同事對(duì)象并提供注冊(cè)方法,同時(shí)聲對(duì)象并提供注冊(cè)方法,同時(shí)聲明了具體中介者類所具有的方明了具體中介者類所具有的方法。在具體中介者類中將實(shí)現(xiàn)法。在具體中介者類中將實(shí)現(xiàn)這些抽象方法。這

8、些抽象方法。中介者模式模式分析n典型的具體中介者類代碼:class ConcreteMediator extends Mediator /實(shí)現(xiàn)業(yè)務(wù)方法,封裝同事之間的調(diào)用 public void operation() . (Colleague)(colleagues.get(0).method1(); /通過中介者調(diào)用同事類的方法 . 在具體中介者類中將調(diào)用同事在具體中介者類中將調(diào)用同事類的方法,調(diào)用時(shí)可以增加一類的方法,調(diào)用時(shí)可以增加一些自己的業(yè)務(wù)代碼對(duì)調(diào)用進(jìn)行些自己的業(yè)務(wù)代碼對(duì)調(diào)用進(jìn)行控制??刂?。中介者模式模式分析n在抽象同事類中維持了一個(gè)抽象中介者的引用,用于調(diào)用中介者的方法,典型的抽

9、象同事類代碼:abstract class Colleague protected Mediator mediator; /維持一個(gè)抽象中介者的引用 public Colleague(Mediator mediator) this.mediator=mediator; public abstract void method1(); /聲明自身方法,處理自己的行為 中介者模式模式分析n典型的具體同事類代碼:class ConcreteColleague extends Colleague public ConcreteColleague(Mediator mediator) super(medi

10、ator); /實(shí)現(xiàn)自身方法 public void method1() . /定義依賴方法,與中介者進(jìn)行通信 public void method2() mediator.operation(); 中介者模式在具體同事類中實(shí)現(xiàn)了在抽象同事在具體同事類中實(shí)現(xiàn)了在抽象同事類中聲明的方法,其中類中聲明的方法,其中method1()方法是同事類的自身方法方法是同事類的自身方法(Self-Method),用于處理自己的行為,用于處理自己的行為,而而method2()方法是依賴方法方法是依賴方法(Depend-Method),用于調(diào)用在中,用于調(diào)用在中介者中定義的方法,依賴中介者來介者中定義的方法,依賴

11、中介者來完成相應(yīng)的行為,例如調(diào)用另一個(gè)完成相應(yīng)的行為,例如調(diào)用另一個(gè)同事類的相關(guān)方法。同事類的相關(guān)方法。中介者模式中介者模式實(shí)例與解析n實(shí)例:虛擬聊天室某論壇系統(tǒng)欲增加一個(gè)虛擬聊天室,允許論壇會(huì)員通過該聊天室進(jìn)行信息交流,普通會(huì)員可以給其他會(huì)員發(fā)送文本信息,鉆石會(huì)員既可以給其他會(huì)員發(fā)送文本信息,還可以發(fā)送圖片信息。該聊天室可以對(duì)指定字符進(jìn)行過濾,如“C”等字符;還可以對(duì)發(fā)送的圖片大小進(jìn)行控制。用中介者模式設(shè)計(jì)該虛擬聊天室。中介者模式中介者模式實(shí)例與解析n實(shí)例:虛擬聊天室1.10.*chatroomAbstractChatroomabstract +register (Member member

12、)sendText (String from, String to, String message)sendImage (String from, String to, String image): void: void: voidMember#chatroomname: AbstractChatroom: String+ChatMember (String name)getName ()setName (String name)getChatroom ()setChatroom (AbstractChatroom chatroom)sendText (String to, String me

13、ssage)sendImage (String to, String image)receiveText (String from, String message)receiveImage (String from, String image): String: void: AbstractChatroom: void: void: void: void: voidDiamondMember+DiamondMember (String name)sendText (String to, String message)sendImage (String to, String image): vo

14、id: voidCommonMember+CommonMember (String name)sendText (String to, String message)sendImage (String to, String image).: void: voidChatGroup- member : Hashtable+register (Member member)sendText (String from, String to, String message)sendImage (String from, String to, String image): void: void: void

15、中介者模式中介者模式實(shí)例與解析n實(shí)例:虛擬聊天室參考代碼 (sample01)演示演示中介者模式模式優(yōu)點(diǎn)n中介者模式簡(jiǎn)化了對(duì)象之間的交互,它用中介者和同事的一對(duì)多交互代替了原來同事之間的多對(duì)多交互,一對(duì)多關(guān)系更容易理解、維護(hù)和擴(kuò)展,將原本難以理解的網(wǎng)狀結(jié)構(gòu)轉(zhuǎn)換成相對(duì)簡(jiǎn)單的星型結(jié)構(gòu)。n中介者模式可將各同事對(duì)象解耦。中介者有利于各同事之間的松耦合,我們可以獨(dú)立的改變和復(fù)用每一個(gè)同事和中介者,增加新的中介者和新的同事類都比較方便,更好地符合“開閉原則”。中介者模式模式優(yōu)點(diǎn)n可以減少子類生成,中介者將原本分布于多個(gè)對(duì)象間的行為集中在一起,改變這些行為只需生成新的中介者子類即可,這使各個(gè)同事類可被重用,

16、無(wú)須對(duì)同事類進(jìn)行擴(kuò)展。模式缺點(diǎn)n在具體中介者類中包含了大量同事之間的交互細(xì)節(jié),可能會(huì)導(dǎo)致具體中介者類非常復(fù)雜,使得系統(tǒng)難以維護(hù)。中介者模式模式適用環(huán)境n系統(tǒng)中對(duì)象之間存在復(fù)雜的引用關(guān)系,系統(tǒng)結(jié)構(gòu)混亂且難以理解。n一個(gè)對(duì)象由于引用了其他很多對(duì)象并且直接和這些對(duì)象通信,導(dǎo)致難以復(fù)用該對(duì)象。n想通過一個(gè)中間類來封裝多個(gè)類中的行為,而又不想生成太多的子類??梢酝ㄟ^引入中介者類來實(shí)現(xiàn),在中介者中定義對(duì)象交互的公共行為,如果需要改變行為則可以增加新的具體中介者類。模式應(yīng)用n中介者模式在事件驅(qū)動(dòng)類軟件中應(yīng)用比較多,在設(shè)計(jì)GUI應(yīng)用程序時(shí),組件之間可能存在較為復(fù)雜的交互關(guān)系,一個(gè)組件的改變將影響與之相關(guān)的其他

17、組件,此時(shí)可以使用中介者模式來對(duì)組件進(jìn)行協(xié)調(diào)。 nMVC 是Java EE 的一個(gè)基本模式,此時(shí)控制器Controller 作為一種中介者,它負(fù)責(zé)控制視圖對(duì)象View和模型對(duì)象Model之間的交互。如在Struts中,Action就可以作為JSP頁(yè)面與業(yè)務(wù)對(duì)象之間的中介者。中介者模式中介者模式模式擴(kuò)展n中介者模式和外觀模式的區(qū)別n外觀模式多用來封裝一個(gè)子系統(tǒng)內(nèi)部的多個(gè)模塊,目的是向子系統(tǒng)外部提供簡(jiǎn)單易用的接口,也就是說外觀模式封裝的是子系統(tǒng)外部和子系統(tǒng)內(nèi)部模塊間的交互;而中介者模式是提供多個(gè)平等的同事對(duì)象之間交互關(guān)系的封裝,一般是用在內(nèi)部實(shí)現(xiàn)上。n外觀模式是實(shí)現(xiàn)單向的交互,是從子系統(tǒng)外部來調(diào)用

18、子系統(tǒng)內(nèi)部,不會(huì)反著來,而中介者模式實(shí)現(xiàn)的是內(nèi)部多個(gè)模塊間多向的交互。中介者模式模式擴(kuò)展n中介者模式和外觀模式的區(qū)別n中介者模式的目的主要是松散多個(gè)模塊之間的耦合,把這些耦合關(guān)系全部放到中介者中去實(shí)現(xiàn);而外觀模式的目的是簡(jiǎn)化客戶端的調(diào)用,這點(diǎn)和中介者模式也不同。小結(jié)中介者模式用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式,它是一種對(duì)象行為型模式。中介者模式包含四個(gè)角色:抽象中介者用于定義一個(gè)接口,該接口用于與各同事對(duì)象之間的通信;具體中介者是抽象中介者的子類,通過協(xié)調(diào)各個(gè)同事對(duì)象來實(shí)現(xiàn)協(xié)作行為,了解并維護(hù)它的各個(gè)同事對(duì)象的引用;抽象同事類定義各同事的公有方法;具體同事類是抽象同事類的子類,每一個(gè)同事對(duì)象都引用一個(gè)中介者對(duì)象;每一個(gè)同事對(duì)象在需要和其他同事對(duì)象通信時(shí),先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實(shí)現(xiàn)了在抽象同事類中定義的方法。小結(jié)通過引入中介者對(duì)象,可以將系統(tǒng)的網(wǎng)狀結(jié)構(gòu)變成以中介者為中心的星形結(jié)構(gòu),中介者承擔(dān)了中轉(zhuǎn)作用和協(xié)調(diào)作用。中介者類是中介者模式的核

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論