設計模式(十七)中介者

来源:https://www.cnblogs.com/WinterSir/archive/2023/12/18/17516116.html
-Advertisement-
Play Games

一、定義 義一個對象來封裝一系列的對象交互。中介者模式使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以讓你相對獨立地改變它們之間的交互。中介者模式又稱為調停模式,它是一種對象說行為型模式。 二、描述 在中介者模式中,引入了用於協調其他對象/類之間的相互調用的中介者類,為了讓系統具有更好的靈活 ...


一、定義

義一個對象來封裝一系列的對象交互。中介者模式使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以讓你相對獨立地改變它們之間的交互。中介者模式又稱為調停模式,它是一種對象說行為型模式。

二、描述

在中介者模式中,引入了用於協調其他對象/類之間的相互調用的中介者類,為了讓系統具有更好的靈活性和可擴展性,通常還提供了抽象中介者,包含以下四個角色:1、Mediator(抽象中介者):它定義了一個介面,該介面用於與各同事對象之間進行通信。
2、ConcreteMediator(具體中介者):它是抽象中介者的子類,通過協調各個同事對象來實現協作行為,維持了各個同事對象的引用。
3、Colleague(抽象同事類):它定義了各個同事類公有的方法,並聲明瞭一些抽象方法來供子類實現,同時維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通信。
4、ConcreteColleague(具體同事類):它是抽象同事類的子類,每一個同事對象需要和其他對象通信時,先與中介者對象通信,通過中介者來間接完成與其他同事類的通信,在具體同事類中實現了在抽象同事類中聲明的抽象方法。

三、例子

X公司欲開發一套CRM系統,其中包含一個客戶信息管理模塊,界麵包含了按鈕、文本框、列表框、下拉框等多個組件,增加或刪除一個客戶,各組件均會發生聯動效果,較為複雜。
Mediator:抽象中介者

public abstract class Mediator
{
    public abstract void ComponenetChanged(Component c);
}

ConcreteMediator:具體中介者

public class ConcreteMediator : Mediator
{
    // 維持對各個同事對象的引用
    public Button addButton;
    public List list;
    public TextBox userNameTextBox;
    public ComboBox cb;

    // 封裝同事對象之間的交互
    public override void ComponenetChanged(Component c)
    {
        // 單擊按鈕
        if (c == addButton)
        {
            Console.WriteLine("-- 單擊增加按鈕 --");
            list.Update();
            cb.Update();
            userNameTextBox.Update();
        }
        // 從列表框選擇客戶
        else if (c == list)
        {
            Console.WriteLine("-- 從列表框選擇客戶 --");
            cb.Select();
            userNameTextBox.SetText();
        }
        // 從組合框選擇客戶
        else if (c == cb)
        {
            Console.WriteLine("-- 從組合框選擇客戶 --");
            cb.Select();
            userNameTextBox.SetText();
        }
    }
}

Component:抽象組件,充當抽象同事類(Colleague)

public abstract class Component
{
    protected Mediator mediator;

    public void SetMediator(Mediator mediator)
    {
        this.mediator = mediator;
    }

    // 轉發調用
    public void Changed()
    {
        mediator.ComponenetChanged(this);
    }

    public abstract void Update();
}

Button、List、ComboBox、TextBox:按鈕、列表框、組合框、文本框,具體組件,充當具體同事類(ConcreteColleague)

public class Button : Component
{
    public override void Update()
    {
        // 按鈕不產生響應
    }
}

public class List : Component
{
    public override void Update()
    {
        Console.WriteLine("列表框增加一項:張無忌");
    }

    public void Select()
    {
        Console.WriteLine("列表框選中項:小龍女");
    }
}

public class ComboBox : Component
{
    public override void Update()
    {
        Console.WriteLine("組合框增加一項:張無忌");
    }

    public void Select()
    {
        Console.WriteLine("組合框選中項:小龍女");
    }
}

public class TextBox : Component
{
    public override void Update()
    {
        Console.WriteLine("客戶信息增加成功後文本框清空");
    }

    public void SetText()
    {
        Console.WriteLine("文本框顯示:小龍女");
    }
}

Program:客戶端測試類

// Step1.定義中介者對象
ConcreteMediator mediator = new ConcreteMediator();

// Step2.定義同事對象
Button addButton = new Button();
List list = new List();
ComboBox cb = new ComboBox();
TextBox userNameTextBox = new TextBox();

addButton.SetMediator(mediator);
list.SetMediator(mediator);
cb.SetMediator(mediator);
userNameTextBox.SetMediator(mediator);

mediator.addButton = addButton;
mediator.list = list;
mediator.cb = cb;
mediator.userNameTextBox = userNameTextBox;

// Step3.點擊增加按鈕
addButton.Changed();

Console.WriteLine("---------------------------------------------");

// Step4.從列表框選擇客戶
list.Changed();
Console.ReadLine();

四、總結

1、優點

(1)中介者模式簡化了對象之間的交互,它用中介者和同事的一對多交互代替了原來同事之間的多對多交互,一對多關係更容易理解、維護和擴展,將原本難以理解的網狀結構轉換成相對簡單的星形結構。
(2)可將各同事對象解耦,中介者模式有利於各同事之間的松耦合,可以獨立地改變和復用每一個同事和中介者,增加新的中介者類和新的同事類都比較方便,更好地符合開閉原則。
(3)可以減少子類的生成,中介者模式將原本分佈於多個對象間的行為集中在一起,改變這些行為只需生成新的中介者子類即可,這使得各個同事類可被重用,無須直接對同事類進行擴展。

2、缺點

(1)具體中介者子類中包含了大量的同事之間的交互細節,可能會導致具體中介者類非常複雜,使得系統難以維護。

測試簽名
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、垂直分庫場景 場景:在業務系統中,涉及一下表結構,但是由於用戶與訂單每天都會產生大量的數據,單台伺服器的數據存儲以及處理能力是有限的,可以對資料庫表進行拆分,原有資料庫如下 說明1:整個業務系統中的表,大致分為四個,商品信息類的表,訂單相關的表,用戶相關表及省市區相關的表,這裡暫時將省市區的表和 ...
  • 成功之前我們要做應該做的事情,成功之後我們才可以做喜歡做的事情。 1. 處理器架構 CPU 架構是 CPU 廠商給屬於同一系列的 CPU 產品定的一個規範,主要目的是為了區分不同類型 CPU 的重要標示。市面上的 CPU 分類主要分有兩大陣營,一個是 intel、AMD 為首的 複雜指令集 CPU, ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 太長不看 不要嵌套使用函數。給每個函數命名並把他們放在你代碼的頂層 利用函數提升。先使用後聲明。 處理每一個異常 編寫可以復用的函數,並把他們封裝成一個模塊 什麼是“回調地獄”? 非同步Javascript代碼,或者說使用callback的 ...
  • 前言 ECMAScript 2023 引入了一些新功能,以改進語言並使其更加強大和無縫。這個新版本帶來了令人興奮的功能和新的 JavaScript 數組方法,使使用 JavaScript 編程更加愉快和輕鬆。本文將帶領讀者全面瞭解數組原型上新 JavaScript 方法。 什麼是ECMAScript ...
  • pinia 兩種寫法定義pinia 第一種:對象形式 不需要寫ref state直接就是響應式數據 import { defineStore } from "pinia" export const useCounterStore = defineStore("useCounterStore ", { ...
  • CLS 衡量的是頁面的整個生命周期內發生的每次意外佈局偏移的最大突發性_佈局偏移分數_。佈局變化的發生是因為瀏覽器傾向於非同步載入頁面元素。更重要的是,您的頁面上可能存在一些初始尺寸未知的媒體元素。這種組合意味著瀏覽器在載入完成之前無法確定單個元素將占用多少空間。因此,這種不確定性帶來的劇烈佈局轉變就... ...
  • 工欲善其事,必先利其器。Chrome 可能是前端開發中使用最多的瀏覽器。在日常開發中,下列幾款 Chrome 擴展也許能讓你的開發工作事半功倍
  • 大家好,我是 Java陳序員。 這幾天,逛 Github 的時候,看到了一個項目 win12 —— 仿 Windows12 網頁版!被它實現的頁面功能震撼到了,大家可以一起來感受下! 首先是登錄頁面。 登錄後,再看看 “電腦桌面”,這風格完全和 Windows 操作系統的一模一樣!預設的應用程式有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...