【设计模式系列】行为型模式之Mediator模式
生活随笔
收集整理的這篇文章主要介紹了
【设计模式系列】行为型模式之Mediator模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概要
基于OO來設計經常會產生很多對象,而這些對象之間又會相互交互影響,所以經常會導致對象間的緊耦合,為了能夠避免這種緊耦合,就需要一種機制讓每個對象能夠很方便的跟其他對象交互而又不需要跟這些對象交叉耦合在一起。怎么做?有人會說Observer模式不就是解決這類問題的嗎?確實,一點沒錯,Observer模式關注的是被觀察主題Subject和觀察者Observer之間的交互。而本文將介紹的Mediator模式也是為了解決這類問題,但關注點跟Observer有所不同,我們來看看它是怎么做的。
目的
定義一個對象來封裝其他一組對象間的交互行為,減少其他對象間的耦合度,讓這些對象間的交互可以更獨立地被修改。
實例
考慮一個UI應用的例子,假設我們的界面需要一些窗口來顯示某些內容,比如顯示產品介紹視頻的窗口,顯示產品圖片的窗口,顯示跟產品視頻配套的介紹文字的窗口,顯示跟產品圖片配套的介紹文字的窗口等。 再假設有這樣的需求: 1.在顯示視頻窗口時需要同步顯示視屏對應的文字窗口,同時還要發送消息給圖片窗口。 2.顯示圖片窗口時需要同步顯示圖片對應的文字窗口同時還要發送消息給視頻窗口。 因為需要同步顯示和傳遞消息,所以不同窗口間就需要進行交互,雖然這種交互很簡單,但我們還是考慮用Mediator模式來處理,看看它是怎么解除這些窗口間的耦合。 使用Mediator來處理的類圖和代碼如下:
class Mediator {virtual void VideoSync() = 0;virtual void ImageSync() = 0; }; class Dialog { public:Dialog(Mediator* md) {mMediator = md;}void SendMessage() {......}virtual void Show() = 0; protected:Mediator* mMediator; }; class TxtDialog : public Dialog { public:virtual void Show() {......} }; class VideoDialog : public Dialog { public:virtual void Show() {......mMediator->VideoSync();} }; class ImageDialog : public Dialog { public:virtual void Show() {......mMediator->ImageSync();} }; class SyncMediator : public Mediator { public:......virtual void VideoSync() {mVideoTxt->Show();mImage->SendMessage();}virtual void ImageSync() {mImageTxt->Show();mVideo->SendMessage();} private:TxtDialog* mImageTxt;TxtDialog* mVideoTxt;ImageDialog* mImage;VideoDialog* mVideo; };
從實現來看, 不管是Video窗口還是Image窗口都不需要去關注跟其他窗口間處理的細節,把交互處理全部轉交給了SyncMediator來做,而在SyncMediator中則封裝了所有窗口間的交互工作,提供方法給窗口類使用。
應用 在實際開發中,Mediator模式的應用雖然很常見但是普遍程度以及受認可程度卻遠不如Observer模式等,原因就是Mediator模式的缺點跟優點一樣非常明顯。 優點大家應該已經都能看出來了,首先把很多邏輯都歸結到Mediator類,使代碼邏輯更簡單而易于理解,其次降低了對象間的耦合程度,第三統一了對象間的交互規則。那么缺點呢?總結來說就一點,那就是過多的邏輯歸結與一處,往往會使Mediator過于復雜,降低其他對象耦合的同時卻使Mediator本身難以理解和維護,所以選用的時候需要慎重。
基于OO來設計經常會產生很多對象,而這些對象之間又會相互交互影響,所以經常會導致對象間的緊耦合,為了能夠避免這種緊耦合,就需要一種機制讓每個對象能夠很方便的跟其他對象交互而又不需要跟這些對象交叉耦合在一起。怎么做?有人會說Observer模式不就是解決這類問題的嗎?確實,一點沒錯,Observer模式關注的是被觀察主題Subject和觀察者Observer之間的交互。而本文將介紹的Mediator模式也是為了解決這類問題,但關注點跟Observer有所不同,我們來看看它是怎么做的。
目的
定義一個對象來封裝其他一組對象間的交互行為,減少其他對象間的耦合度,讓這些對象間的交互可以更獨立地被修改。
實例
考慮一個UI應用的例子,假設我們的界面需要一些窗口來顯示某些內容,比如顯示產品介紹視頻的窗口,顯示產品圖片的窗口,顯示跟產品視頻配套的介紹文字的窗口,顯示跟產品圖片配套的介紹文字的窗口等。 再假設有這樣的需求: 1.在顯示視頻窗口時需要同步顯示視屏對應的文字窗口,同時還要發送消息給圖片窗口。 2.顯示圖片窗口時需要同步顯示圖片對應的文字窗口同時還要發送消息給視頻窗口。 因為需要同步顯示和傳遞消息,所以不同窗口間就需要進行交互,雖然這種交互很簡單,但我們還是考慮用Mediator模式來處理,看看它是怎么解除這些窗口間的耦合。 使用Mediator來處理的類圖和代碼如下:
class Mediator {virtual void VideoSync() = 0;virtual void ImageSync() = 0; }; class Dialog { public:Dialog(Mediator* md) {mMediator = md;}void SendMessage() {......}virtual void Show() = 0; protected:Mediator* mMediator; }; class TxtDialog : public Dialog { public:virtual void Show() {......} }; class VideoDialog : public Dialog { public:virtual void Show() {......mMediator->VideoSync();} }; class ImageDialog : public Dialog { public:virtual void Show() {......mMediator->ImageSync();} }; class SyncMediator : public Mediator { public:......virtual void VideoSync() {mVideoTxt->Show();mImage->SendMessage();}virtual void ImageSync() {mImageTxt->Show();mVideo->SendMessage();} private:TxtDialog* mImageTxt;TxtDialog* mVideoTxt;ImageDialog* mImage;VideoDialog* mVideo; };
從實現來看, 不管是Video窗口還是Image窗口都不需要去關注跟其他窗口間處理的細節,把交互處理全部轉交給了SyncMediator來做,而在SyncMediator中則封裝了所有窗口間的交互工作,提供方法給窗口類使用。
應用 在實際開發中,Mediator模式的應用雖然很常見但是普遍程度以及受認可程度卻遠不如Observer模式等,原因就是Mediator模式的缺點跟優點一樣非常明顯。 優點大家應該已經都能看出來了,首先把很多邏輯都歸結到Mediator類,使代碼邏輯更簡單而易于理解,其次降低了對象間的耦合程度,第三統一了對象間的交互規則。那么缺點呢?總結來說就一點,那就是過多的邏輯歸結與一處,往往會使Mediator過于復雜,降低其他對象耦合的同時卻使Mediator本身難以理解和維護,所以選用的時候需要慎重。
轉載于:https://www.cnblogs.com/secbook/archive/2012/07/04/2655100.html
總結
以上是生活随笔為你收集整理的【设计模式系列】行为型模式之Mediator模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重置oracle 11G的system、
- 下一篇: 扩展easyui tree的两个方法 获