版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職旅游服務(wù)與管理(旅游投訴處理)試題及答案
- 2025年高職安全工程技術(shù)(事故預(yù)防技術(shù))試題及答案
- 2025年大學(xué)大一(基礎(chǔ)醫(yī)學(xué))人體解剖學(xué)基礎(chǔ)試題及答案
- 2025年高職會(huì)計(jì)軟件應(yīng)用(賬務(wù)處理)試題及答案
- 2025年中職口腔護(hù)理(口腔清潔護(hù)理)試題及答案
- 2025年高職母乳喂養(yǎng)指導(dǎo)(技巧傳授)試題及答案
- 2025年大學(xué)大四(藥學(xué))藥物分析綜合測試試題及答案
- 2025年大學(xué)第二學(xué)年(汽車服務(wù)工程)汽車營銷策劃試題及答案
- 2026年注冊(cè)化工工程師(基礎(chǔ)考試上)試題及答案
- 2025年大學(xué)二年級(jí)(動(dòng)物育種學(xué))動(dòng)物遺傳育種試題及答案
- 2026年農(nóng)夫山泉-AI-面試題目及答案
- 2025年國考《行測》真題庫地市完美版
- 2026年包頭鐵道職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫及答案詳解
- 2025貴州遵義市仁懷市公共交通服務(wù)有限公司招聘公交駕駛員及管理人員招聘141人考試參考題庫附答案
- 廣東省普通高中2026屆第一次學(xué)業(yè)水平合格性考試自查卷語文試題(含答案)
- 2025廣西北海市城市開發(fā)投資集團(tuán)有限公司招聘10人筆試參考題庫附帶答案詳解
- 2026年面向社會(huì)招聘太湖縣政務(wù)服務(wù)中心綜合窗口工作人員的備考題庫及完整答案詳解一套
- 2026凱翼汽車全球校園招聘(公共基礎(chǔ)知識(shí))綜合能力測試題附答案
- 腫瘤免疫治療進(jìn)展
- 山東省威海市環(huán)翠區(qū)2024-2025學(xué)年一年級(jí)上學(xué)期1月期末數(shù)學(xué)試題
- 2025年人保車險(xiǎn)理賠試題及答案
評(píng)論
0/150
提交評(píng)論