22 設(shè)計(jì)模式教學(xué)課件_第1頁
22 設(shè)計(jì)模式教學(xué)課件_第2頁
22 設(shè)計(jì)模式教學(xué)課件_第3頁
22 設(shè)計(jì)模式教學(xué)課件_第4頁
22 設(shè)計(jì)模式教學(xué)課件_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1,橋接(Bridge)模式,2,場景描述,考慮這樣一個(gè)實(shí)際的業(yè)務(wù)功能:發(fā)送提示消息?;旧纤袔I(yè)務(wù)流程處理的系統(tǒng)都會(huì)有這樣的功能,比如某人有新的工作了,需要發(fā)送一條消息提示他。 從業(yè)務(wù)上看,消息又分成普通消息、加急消息和特急消息多種,不同的消息類型,業(yè)務(wù)功能處理是不一樣的,比如加急消息是在消息上添加加急,而特急消息除了添加特急外,還會(huì)做一條催促的記錄,多久不完成會(huì)繼續(xù)催促。從發(fā)送消息的手段上看,又有系統(tǒng)內(nèi)短消息、手機(jī)短消息、郵件等等。 現(xiàn)在要實(shí)現(xiàn)這樣的發(fā)送提示消息的功能,該如何實(shí)現(xiàn)呢?,3,不用模式的解決方案,實(shí)現(xiàn)簡化版本-只實(shí)現(xiàn)發(fā)送普通消息 發(fā)送的方式,先實(shí)現(xiàn)系統(tǒng)內(nèi)短消息和郵件。其它的功

2、能,等這個(gè)版本完成過后,再繼續(xù)添加。 由于發(fā)送普通消息會(huì)有兩種不同的實(shí)現(xiàn)方式,為了讓外部能統(tǒng)一操作,因此,把消息設(shè)計(jì)成接口,然后由兩個(gè)不同的實(shí)現(xiàn)類,分別實(shí)現(xiàn)系統(tǒng)內(nèi)短消息方式和郵件發(fā)送消息的方式,4,public interface Message public void send(String message,String toUser); ,5,public class CommonMessageSMS implements Message public void send(String message, String toUser) System.out.println(使用站內(nèi)短消息的方

3、式,發(fā)送消息+message+給+toUser); public class CommonMessageEmail implements Message public void send(String message, String toUser) System.out.println(使用Email的方式,發(fā)送消息 +message+給+toUser); ,6,實(shí)現(xiàn)發(fā)送加急消息,添加發(fā)送加急消息的功能,也有兩種發(fā)送的方式,同樣是站內(nèi)短消息和Email的方式。 加急消息的實(shí)現(xiàn)跟普通消息不同,加急消息會(huì)自動(dòng)在消息上添加加急,然后再發(fā)送消息;另外加急消息會(huì)提供監(jiān)控的方法,讓客戶端可以隨時(shí)通過這個(gè)方

4、法來了解對(duì)于加急消息處理的進(jìn)度,比如:相應(yīng)的人員是否接收到這個(gè)信息,相應(yīng)的工作是否已經(jīng)開展等等。 因此加急消息需要擴(kuò)展出一個(gè)新的接口,除了基本的發(fā)送消息的功能,還需要添加監(jiān)控的功能,7,public interface UrgencyMessage extends Message public Object watch(String messageId); ,8,public class UrgencyMessageSMS implements UrgencyMessage public void send(String message, String toUser) message = 加急

5、:+message; System.out.println(使用站內(nèi)短消息的方式,發(fā)送消息 +message+給+toUser); public Object watch(String messageId) /獲取相應(yīng)的數(shù)據(jù),組織成監(jiān)控的數(shù)據(jù)對(duì)象,然后返回 return null; ,9,public class UrgencyMessageEmail implements UrgencyMessage public void send(String message, String toUser) message = 加急:+message; System.out.println(使用Emai

6、l的方式,發(fā)送消息 +message+給+toUser); public Object watch(String messageId) /獲取相應(yīng)的數(shù)據(jù),組織成監(jiān)控的數(shù)據(jù)對(duì)象,然后返回 return null; ,10,有何問題,繼續(xù)添加特急消息的處理,11,通過這種繼承的方式來擴(kuò)展消息處理,會(huì)非常不方便。 實(shí)現(xiàn)加急消息處理的時(shí)候,必須實(shí)現(xiàn)站內(nèi)短消息和Email兩種處理方式,因?yàn)闃I(yè)務(wù)處理可能不同;在實(shí)現(xiàn)特急消息處理的時(shí)候,又必須實(shí)現(xiàn)站內(nèi)短消息和Email這兩種處理方式。 這意味著,以后每次擴(kuò)展一下消息處理,都必須要實(shí)現(xiàn)這兩種處理方式。 如果要添加新的實(shí)現(xiàn)方式呢? ?,12,繼續(xù)添加發(fā)送手機(jī)消息

7、的處理方式,13,缺陷,采用通過繼承來擴(kuò)展的實(shí)現(xiàn)方式,有個(gè)明顯的缺點(diǎn):擴(kuò)展消息的種類不太容易,不同種類的消息具有不同的業(yè)務(wù),也就是有不同的實(shí)現(xiàn),在這種情況下,每個(gè)種類的消息,需要實(shí)現(xiàn)所有不同的消息發(fā)送方式。 如果要新加入一種消息的發(fā)送方式,那么會(huì)要求所有的消息種類,都要加入這種新的發(fā)送方式的實(shí)現(xiàn)。,14,橋接模式來解決,用來解決上述問題的一個(gè)合理的解決方案,就是使用橋接模式,15,橋接模式是一個(gè)非常有用的模式,也是比較復(fù)雜的一個(gè)模式。熟悉這個(gè)模式對(duì)于理解面向?qū)ο蟮脑O(shè)計(jì)原則,包括開閉原則(OCP)以及組合/聚合復(fù)用原則(CARP)都很有幫助。理解好這兩個(gè)原則,有助于形成正確的設(shè)計(jì)思想和培養(yǎng)良好的

8、設(shè)計(jì)風(fēng)格。,16,總結(jié)面向?qū)ο髮?shí)際上就兩句話:一是松耦合(Coupling),二是高內(nèi)聚(Cohesion)。面向?qū)ο笙到y(tǒng)追求的目標(biāo)就是盡可能地提高系統(tǒng)模塊內(nèi)部的內(nèi)聚(Cohesion)、盡可能降低模塊間的耦合(Coupling)。然而這也是面向?qū)ο笤O(shè)計(jì)過程中最難把握的部分,17,18,【GOF95】在提出Bridge模式的時(shí)候指出, Bridge模式的用意是“將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化”。 三個(gè)關(guān)鍵詞: 抽象化、實(shí)現(xiàn)化和脫耦。,19,脫耦,所謂耦合,就是兩個(gè)實(shí)體的行為的某種強(qiáng)關(guān)聯(lián)。而將它們的強(qiáng)關(guān)聯(lián)去掉,就是耦合的解脫

9、,或稱脫耦。在這里,脫耦是指將抽象化和實(shí)現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián)。 將兩個(gè)角色之間的繼承關(guān)系改為聚合關(guān)系,就是將它們之間的強(qiáng)關(guān)聯(lián)改換成為弱關(guān)聯(lián)。 因此,橋連模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化。這就是橋連模式的用意。,20,21,22,可以看出,這個(gè)系統(tǒng)含有兩個(gè)等級(jí)結(jié)構(gòu),也就是: 由抽象化角色和修正抽象化角色組成的抽象化等級(jí)結(jié)構(gòu)。 由實(shí)現(xiàn)化角色和兩個(gè)具體實(shí)現(xiàn)化角色所組成的實(shí)現(xiàn)化等級(jí)結(jié)構(gòu)。,23,代碼示意,abstract class Implementor public ab

10、stract void Operation(); ,24,class ConcreteImplementorA : Implementor public override void Operation() Console.WriteLine(具體實(shí)現(xiàn)A的方法執(zhí)行); class ConcreteImplementorB : Implementor public override void Operation() Console.WriteLine(具體實(shí)現(xiàn)B的方法執(zhí)行); ,25,class Abstraction protected Implementor implementor; publ

11、ic void SetImplementor(Implementor implementor) this.implementor = implementor; public virtual void Operation() implementor.Operation(); ,26,class RefinedAbstraction : Abstraction public override void Operation() implementor.Operation(); ,27,class Program static void Main(string args) Abstraction ab

12、 = new RefinedAbstraction(); ab.SetImplementor(new ConcreteImplementorA(); ab.Operation(); ab.SetImplementor(new ConcreteImplementorB(); ab.Operation(); Console.Read(); ,28,使用橋接模式重寫示例,從簡單功能開始 先實(shí)現(xiàn)普通消息和加急消息的功能,發(fā)送方式先實(shí)現(xiàn)站內(nèi)短消息和Email這兩種,29,public interface MessageImplementor public void send(String message

13、,String toUser); public abstract class AbstractMessage protected MessageImplementor impl; public AbstractMessage(MessageImplementor impl) this.impl = impl; /* 發(fā)送消息,轉(zhuǎn)調(diào)實(shí)現(xiàn)部分的方法 */ public void sendMessage(String message,String toUser) this.impl.send(message, toUser); ,30,/* 以站內(nèi)短消息的方式發(fā)送消息 */ public class

14、 MessageSMS implements MessageImplementor public void send(String message, String toUser) System.out.println(使用站內(nèi)短消息的方式,發(fā)送消息 +message+給+toUser); /*以Email的方式發(fā)送消息*/ public class MessageEmail implements MessageImplementor public void send(String message, String toUser) System.out.println(使用Email的方式,發(fā)送消

15、息 +message+給+toUser); ,31,擴(kuò)展抽象的消息接口,/*普通消息*/ public class CommonMessage extends AbstractMessage public CommonMessage(MessageImplementor impl) super(impl); public void sendMessage(String message, String toUser) super.sendMessage(message, toUser); ,32,加急消息,public class UrgencyMessage extends AbstractM

16、essage public UrgencyMessage(MessageImplementor impl) super(impl); public void sendMessage(String message, String toUser) message = 加急:+message; super.sendMessage(message, toUser); public Object watch(String messageId) return null; ,33,看看是否能解決前面提出的問題,來添加還未實(shí)現(xiàn)的功能看看,添加對(duì)特急消息的處理,同時(shí)添加一個(gè)使用手機(jī)發(fā)送消息的方式。該怎么實(shí)現(xiàn)呢?

17、 只需要在抽象部分再添加一個(gè)特急消息的類,擴(kuò)展抽象消息就可以把特急消息的處理功能加入到系統(tǒng)中了; 對(duì)于添加手機(jī)發(fā)送消息的方式也很簡單,在實(shí)現(xiàn)部分新增加一個(gè)實(shí)現(xiàn)類,實(shí)現(xiàn)用手機(jī)發(fā)送消息的方式,也就可以了。 采用橋接模式來實(shí)現(xiàn)過后,抽象部分和實(shí)現(xiàn)部分分離開了,可以相互獨(dú)立的變化,而不會(huì)相互影響??纯创a的實(shí)現(xiàn),34,特急消息的處理類,public class SpecialUrgencyMessage extends AbstractMessage public SpecialUrgencyMessage(MessageImplementor impl) super(impl); public vo

18、id hurry(String messageId) /執(zhí)行催促的業(yè)務(wù),發(fā)出催促的信息 public void sendMessage(String message, String toUser) message = 特急:+message; super.sendMessage(message, toUser); ,35,使用手機(jī)短消息的方式發(fā)送消息的實(shí)現(xiàn),public class MessageMobile implements MessageImplementor public void send(String message, String toUser) System.out.prin

19、tln(使用手機(jī)短消息的方式,發(fā)送消息 +message+給+toUser); ,36,public class Client public static void main(String args) MessageImplementor impl = new MessageSMS(); AbstractMessage m = new CommonMessage(impl); m.sendMessage(請(qǐng)喝一杯茶, 小李); m = new UrgencyMessage(impl); m.sendMessage(請(qǐng)喝一杯茶, 小李); m = new SpecialUrgencyMessage(impl); m.sendMess

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論