1. 程式人生 > >【每日一記】設計模式——中介者模式

【每日一記】設計模式——中介者模式

概述

  • 定義:定義一箇中介物件來封裝系列物件之間的互動。
  • 適用場景:
    1. 一組定義良好的物件,現在要進行復雜的通訊
    2. 定製一個分佈在多個類中的行為,而又不想生成太多的子類

實現

// 同事類
public abstract class AbstractColleague {
    protected String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public
abstract void sendMsg(String msg, AbstractMediator mediator); } class ColleagueA extends AbstractColleague { @Override public void sendMsg(String msg, AbstractMediator mediator) { this.msg = msg; mediator.AaffectB(); } } class ColleagueB extends AbstractColleague { @Override
public void sendMsg(String msg, AbstractMediator mediator) { this.msg = msg; mediator.BaffectA(); } }
// 中介者
public abstract class AbstractMediator {
    protected ColleagueA a;
    protected ColleagueB b;

    public AbstractMediator(ColleagueA a, ColleagueB b) {
        super
(); this.a = a; this.b = b; } public abstract void AaffectB(); public abstract void BaffectA(); } class Mediator extends AbstractMediator { public Mediator(ColleagueA a, ColleagueB b) { super(a, b); } @Override public void AaffectB() { String msg = a.getMsg(); b.setMsg("receive from A: " + msg); } @Override public void BaffectA() { String msg = b.getMsg(); a.setMsg("receive from B: " + msg); } }
// 客戶端
public class Client {
    public static void main(String[] args) throws Exception {
        ColleagueA a = new ColleagueA();
        ColleagueB b = new ColleagueB();
        AbstractMediator m = new Mediator(a, b);
        a.sendMsg("hello", m);
        System.out.println("a: " + a.getMsg());
        System.out.println("b: " + b.getMsg());
        b.sendMsg("world", m);
        System.out.println("a: " + a.getMsg());
        System.out.println("b: " + b.getMsg());
    }
}

使用中介者模式可以避免同事類之間的過度耦合,也可以將物件間一對多的關聯轉變為一對一的關聯,使物件間的關係易於理解和維護

相關推薦

每日設計模式——中介模式

概述 定義:定義一箇中介物件來封裝系列物件之間的互動。 適用場景: 一組定義良好的物件,現在要進行復雜的通訊 定製一個分佈在多個類中的行為,而又不想生成太多的子類 實現 // 同事類 p

每日設計模式——橋接模式

概述 意圖:將抽象部分與它的實現部分分離,使它們都可以獨立地變化 適用場景:某個類具有兩個或兩個以上的維度變化,如果只是用繼承將無法實現這種需要,則可以使用橋接模式 實現 以一個人做運動的例子進行說明,其中人和運動為可變唯獨:人可分為男人、女人,運

每日設計模式——代理模式

概述 定義:為其他物件提供一種代理以控制對這個物件的訪問 適用場景: 遠端代理:為一個物件在不同的地址空間提供區域性代表。這樣可以隱藏一個物件存在於不同地址空間的事實 虛擬代理:根據需要建立開銷很大的物件。通過它來存放例項化需要很長時間的真實物件 安全代理

每日設計模式——開篇

寫在最前 未曾清貧難成人,不經打擊老天真。 自古英雄出煉獄,從來富貴入凡塵。 醉生夢死誰成氣,拓馬長槍定乾坤。 揮軍千里山河在,立名揚威傳後人。 沒有夢想和鹹魚有什麼區別,沒有技術光有夢想又有何用,所以從今天起開個系列記錄自己

(轉載)[海莉zhe] 每日Unity3D 實戰練習-實現物體的映象 (十四)

http://www.manew.com/thread-140831-1-1.html     最近在學習如何實現物體的映象,練習了一個簡單的例子,然後和大家一起探討一下哈!物體映象的操作實際上是通過一個模型的MeshFilter 和 MeshRenderer 來獲取

每日

意義 什麽 就是 自己 有意 地方 別人 現實 有時 每日一悟 【做“該”做的,不做“不該”做的】 有時候你覺得盡心盡力,別人根本不懂; 有時候你覺得付出很多,但 是在對其他部門付出,自己部門的人看不見,一樣沒有意義。 所以現實就是,不要在別人看不到的地方做事。 如果看不到

每日數據倉庫之全量表、增量表、拉鏈表、流水表

水表 打開 tails 開始 當我 net 最大的 閱讀 增量 每日一悟 數據倉庫之全量表、增量表、拉鏈表、流水表 背景 從使用MySQL階段,到前陣子跳槽到新公司開始使用hive,面對的表變多,數據量也完全超過之前。基本是隨便核查個問題都已經不是Excel能承擔得起的了

每日wehome增長數字

思維 大會 新產品 受限 方法 深圳 產品 需要 是不是 每日一悟 airbnb增長數字 這周在做新產品的數據體系規劃,越寫下去越覺著思維受限。找到了一點框架的感覺,但總是覺著不夠,畢竟事務總是在變化的,而我不知道我所掌握的是不是夠先進。另一方面,對於特殊關鍵點也在費勁心

每日python-logistics回歸

gis 目的 碎片 python 想想你 自己的 是不是 logistic 小時 每日一悟 【每天都想想你的目標是什麽】 工作時,雖然沒什麽成就,但總是感覺忙得得不了閑。 像這種單雙休每天早十晚八點半的日子,再加上通勤倆個多小時,待在家的時間就只剩下早八點半前,晚上十點後。

每日裝飾器

count 其他 用戶登陸 glob 每日一練 div class 密碼 try 寫一個用戶登錄認證函數,要求: 1.要求用戶輸入賬號密碼和txt中的用戶名數據庫對比; 2.要求用戶有三次嘗試機會; 3.要求用戶登陸後,執行其他功能無需再驗證; txt數據: {‘auth_

每日獎金問題

一:問題描述 二:問題分析     涉及資料:利潤profit,獎金bonus     資料間的關係:當profit<=10w,bonus = pro

每日

題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 程式碼: num = 0 for i in range(1,5): for a in range(1,5): for b in range(1,5):

每日百元買百雞問題

問題描述: 雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞,問雞翁、母、雛各幾何? Python版 for i in range(0,20): #公雞最多買20只 for x in range(0,33):

每日Java 基本資料型別基礎面試題

原文作者資訊 作者:工匠若水 公眾號: 碼農每日一題 (1)問:如下程式語句有什麼問題嗎? short s1 = 1;s1 = s1 + 1;    //1short s2 = 1;s2 +

每日P魔術橡皮擦摳圖工具的使用

Ps一鍵摳圖。主要用到魔術橡皮擦工具和圖層混合模式引數設定。 素材如下: 效果圖如下: 第一步:Ctrl+O開啟飛機素材,回到工具欄,開啟魔術橡皮擦工具,點選飛機背景圖層,摳圖效果就出來了,效果如下: 第二步:我們可以看到背景層還沒有完全

Java設計模式(十)訪問者模式 中介模式

(二十一)訪問者模式 對已存在的類進行擴充套件,通常需要增加方法,但是如果需要的行為與現有的物件模型不一致,或者無法修改現有程式碼。在這種情況下,不更改類的層次結構,就無法擴充套件該層次結構的行為。如果運用了訪問者模式,就可以支援開發人員擴充套件該類層次結構的行為。 和直譯

每日查詢一個字串中第一個只出現兩次的字元

題目:查詢一個字串中第一個只出現兩次的字元。比如:“abcdefabcdefabc”中第一個只出現兩次為‘d’,要求時間複雜度為O(N),空間複雜度為O(1) 解決方法:可以使用雜湊表統計每個字元出現的次數。因為字元只有256種可能,所以我們可以申請一個25

2014年12月4日每日SOAP、WSDL、UDDI這三者有什麼區別和聯絡?

【答】 Web Service平臺有三種元素構成:SOAP、WSDL、UDDI。 一個消費者可以在UDDI登錄檔查詢服務,取得服務的WSDL描述,然後通過SOAP來呼叫服務。 SOAP、WSDL、UDDI的區別如下: 1. SOAP(Simple Object Access Protocol,簡單物件訪問協議

每日基本資料型別與包裝型別的面試題

基礎知識:1、java中的基本資料型別  java是一個近乎純潔的面向物件程式設計語音,引入基本資料型別是為了程式設計方便,但是為了能夠將這些基本資料型別當成物件操作,java為每一個基本資料型別引入了對應的包裝型別(wrapper class)。具體如下:  int  --

設計模式——中介模式/調停模式(C++實現)

con 分享 else .cn sign name 得到 ted esp 1 #include <iostream> 2 #include <string> 3 4 using namespace std;