設計模式筆記(二十一) —— 中介者模式
中介者模式(Mediator):用一箇中介者物件來封裝一系列的物件互動。中介者物件使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的互動。中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現了“多對多”互動複雜的物件群時,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理。
優點:Mediator的出現減少了各個Colleague的耦合,便使得可以獨立的改變和複用各個Colleague和Mediator,由於把物件如何協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個物件中,這樣關注的物件就從物件各自本身的行為轉移到他們之間的互動上來,也就是站在一個更巨集觀的角度去看待系統。由於ConcreteMediator控制了集中化,於是就把互動複雜性變為了中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜。
使用場合:
- using System;
- using System.Collections.Generic;
- /**概述
- * 中介者模式(Mediator):用一箇中介者物件來封裝一系列的物件互動。中介者物件使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的互動。中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現了“多對多”互動複雜的物件群時,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理。
- * 優點:Mediator的出現減少了各個Colleague的耦合,便使得可以獨立的改變和複用各個Colleague和Mediator,由於把物件如何協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個物件中,這樣關注的物件就從物件各自本身的行為轉移到他們之間的互動上來,也就是站在一個更巨集觀的角度去看待系統。由於ConcreteMediator控制了集中化,於是就把互動複雜性變為了中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜。
- * 使用場合:中介者模式一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合,以及想定製一個分佈在各個類中的行為,而又不想生成太多的子類的場合。
- */
- namespace StuDesignMode.Mediator
- {
- interface IMediator
- {
- void Send(string message,AbsColleague colleague);
- }
- abstractclass AbsColleague
- {
- protected IMediator Mediator { get; set; }
- public AbsColleague(IMediator mediator)
- {
- this.Mediator = mediator;
- }
- }
- class ConcreteMediator : IMediator
- {
- private ConcreteColleague1 _colleague1;
- private ConcreteColleague2 _colleague2;
- public ConcreteColleague1 Colleague1 { set { this._colleague1 = value; } }
- public ConcreteColleague2 Colleague2 { set { this._colleague2 = value; } }
- publicvoid Send(string message, AbsColleague colleague)
- {
- if (colleague == _colleague1)
- {
- _colleague2.Notify(message);
- }
- elseif (colleague == _colleague2)
- {
- _colleague1.Notify(message);
- }
- }
- }
- class ConcreteColleague1 : AbsColleague
- {
- public ConcreteColleague1(IMediator mediator) : base(mediator) { }
- publicvoid Send(string message)
- {
- this.Mediator.Send(message,this);
- }
- publicvoid Notify(string message)
- {
- Console.WriteLine("同事一得到訊息:{0}",message);
- }
- }
- class ConcreteColleague2 : AbsColleague
- {
- public ConcreteColleague2(IMediator mediator) : base(mediator) { }
- publicvoid Send(string message)
- {
- this.Mediator.Send(message, this);
- }
- publicvoid Notify(string message)
- {
- Console.WriteLine("同事二得到訊息:{0}",message);
- }
- }
- class ClientTest
- {
- staticvoid Main(string[] args)
- {
- ConcreteMediator mediator = new ConcreteMediator();
- ConcreteColleague1 coll1 = new ConcreteColleague1(mediator);
- ConcreteColleague2 coll2 = new ConcreteColleague2(mediator);
- mediator.Colleague1 = coll1;
- mediator.Colleague2 = coll2;
- coll1.Send("吃飯了麼?");
- coll2.Send("還沒呢,你呢?");
- }
- }
- }
相關推薦
設計模式筆記(二十一) —— 中介者模式
中介者模式(Mediator):用一箇中介者物件來封裝一系列的物件互動。中介者物件使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的互動。中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現了“多對多”互動複雜的物件群時,不要急於使用中介者
軟體設計模式學習(二十一)中介者模式
> 對於那些存在物件之間複雜互動關係的系統,中介者模式提供了一種簡化複雜互動的解決方案,即通過引入一箇中介者,將原本物件之間的兩兩互動轉化為每個物件與中介者之間的互動 ## 模式動機 以微信聊天為例,可以使用者與使用者直接聊天,也可以通過微信群聊天。前者的話,使用者要和別的使用者加為好友,即使用者
一個故事貫穿設計模式(二十一)中介者模式
這裡記錄的是中介者模式。 在解耦上面具有重要的意義。 包結構: 類結構: 測試入口: package com.automannn.design_mode.mediator.test; import com.automannn.design
設計模式(二十一)中介者模式
中介者模式(Mediator):用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地相互引用,從未使其耦合鬆散,而且可以獨立地改變他們之間的互動 類圖的來源: public abstract class Mediator { public
C++設計模式(二十一)—中介者模式
中介者模式 用一箇中介物件來封裝一系列的物件互動。中介者使個各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。 本文講解中介者模式框架,程式碼使用C++語言描述,程式碼存在的不足或問題有望各位指出。 中介者模式程式碼框
設計模式C++實現二十一:中介者模式
中介者模式(Mediator):用一箇中介物件來封裝一系列的物件互動。中介者是各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動。 中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現多對多互動複雜的物件群是,不要急於使用中介者模式,而
雲端計算設計模式(二十一)——Sharding分片模式
雲端計算設計模式(二十一)——Sharding分片模式將一個資料儲存到一組水平分割槽或碎片。儲存和訪問大量資料時,這個模式可以提高可擴充套件性。背景和問題由一個單一的伺服器託管的資料儲存區可能會受到以下限制:•儲存空間。一種資料儲存為一個大型雲應用可以預期含有資料量巨大,可以
Python學習筆記(二十一)
準備 for ring 價格 python use imp pri exce 使用ElementTree解析XML文件 # 導入Python中內置的處理XML文件的模塊try: import xml.etree.cElementTree as ETexcept Imp
Java學習筆記(二十一):類型轉換和instanceof關鍵字
方法 png true feed out 實例 strong 運算符 nbsp 基本數據類型轉換: 自動類型轉換:把大類型的數據賦值給大類型的變量(此時的大小指的是容量的範圍) 1 byte b = 12; //byte是一個字節 2 int i = b; //i
Java開發筆記(二十一)二維數組的擴展
賦值 如同 div 當前 完全 長度 例如 如何使用 說明 前面介紹的數組容納的是一串數字,仿佛一根線把這組數字串了起來,故而它只是一維數組。一維數組用來表示簡單的數列尚可,要是表達復雜的平面坐標系,那就力不從心了。由於平面坐標系存在水平和垂直兩個方向,因此可用二維數組來保
Java開發筆記(二十一)二維陣列的擴充套件
前面介紹的陣列容納的是一串數字,彷彿一根線把這組數字串了起來,故而它只是一維陣列。一維陣列用來表示簡單的數列尚可,要是表達複雜的平面座標系,那就力不從心了。由於平面座標系存在水平和垂直兩個方向,因此可用二維陣列來儲存平面座標系上的一組座標頂點,其中第一維是頂點佇列,第二維是頂點的橫縱座標。許多個平面組合起來變
nginx 原始碼學習筆記(二十一)—— event 模組(二) ——事件驅動核心ngx_process_events_and_timers
首先繼續回憶下,之前子執行緒執行操作裡面有一個未涉及的內容ngx_process_events_and_timers,今天我們就來研究下這個函式。 本篇文章來自於:http://blog.csdn.net/lengzijian/article/details/7601730 先來看一下第十九
Effective_STL 學習筆記(二十一) 永遠讓比較函式對相等的值返回 false
除非比較函式總是為相等的值返回 false,否則將會打破所有的標準關聯容器, 不管關聯容器是否允許存在副本(set、map、multiset、multimap) 對於(set、map)使用 less_equal (<=): 1 !( 10A <= 10B ) &a
機器學習筆記(二十一):TensorFlow實戰十三(遷移學習)
1 - 引言 越複雜的神經網路,需要的訓練集越大,ImageNet影象分類資料集有120萬標註圖片,所以才能將152層的ResNet的模型訓練到大約96.%的正確率。但是在真正的應用中,很難收集到如此多的標註資料。即使收集到也需要花費大量人力物力來標註。並且即使有了大量的資料集,要訓練一
Javaweb學習筆記——(二十一)——————過濾器
過濾器 過濾器概述 1.什麼是過濾器: 過濾器javaweb三大元件之一,它與Serlvet很相似,不過它過濾器是用來攔截請求的,而不是處理 請求的。 當用戶請求某個Servlet
Java筆記(二十一) 動態代理
動態代理 一、靜態代理 代理的背後一般至少有一個實際物件,代理的外部功能和實際物件一般是一樣的, 使用者與代理打交道,不直接接觸實際物件。代理存在的價值: 1)節省成本比較高的實際物件建立開銷,按需延遲載入,建立代理時 並不正真建立實際物件,而只是儲存實際物件的地址,在需要時再載入或者建立。 2)
OpenCV學習筆記(二十一)——簡單的單目視覺測距嘗試
前言: 視覺測距作為機器視覺領域內基礎技術之一而受到廣泛的關注,其在機器人領域內佔有重要的地位,廣泛應用於機器視覺定位、目標跟蹤、視覺避障等。機器視覺測量主要分為:單目視覺測量、雙目視覺測量、結構光視覺測量等。結構光由於光源的限制,應用的場合比較固定;
OpenCV學習筆記(二十一)——車輛識別和跟蹤
今天在GitHub上看到一個對車輛訓練好的模型,即xml檔案,於是拿來測試了一個效果。我用這個xml檔案對視訊中的每一幀畫面進行簡單的車輛識別定位,演示程式碼如下:import cv2 import numpy as np camera = cv2.VideoCa
unity shader學習筆記(二十一)——Unity中的高階紋理之渲染紋理
渲染紋理 渲染目標紋理(Render Target Texture, RTT)是指一個攝像機將渲染結果輸出到顏色緩衝中,並顯示到螢幕上,而不是傳統的幀緩衝和後備緩衝。 多重渲染目標(Multiple Render Target, MRT)是指把場景同
設計模式(二十一)—— 狀態模式
uml public bubuko interface 對象 con 原理 處理 環境 模式簡介 允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。 在某些情況下,一個對象的行為取決於它當前所處的狀態,當對象屬性(狀態)在系統運行過程中發生變化,