Java描述設計模式(17):調停者模式

来源:https://www.cnblogs.com/cicada-smile/archive/2019/11/11/11838353.html
-Advertisement-
Play Games

本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、生活場景 1、場景描述 在公司的日常安排中,通常劃分多個部門,每個部門又會分為不同的小組,部門經理的一項核心工作就是協調部門小組之間的工作,例如開發小組,產品小組,小組的需求統一彙總到經理,經理統一安排和協調。 2、場景圖解 3 ...


本文源碼:GitHub·點這裡 || GitEE·點這裡

一、生活場景

1、場景描述

在公司的日常安排中,通常劃分多個部門,每個部門又會分為不同的小組,部門經理的一項核心工作就是協調部門小組之間的工作,例如開發小組,產品小組,小組的需求統一彙總到經理,經理統一安排和協調。

2、場景圖解

3、代碼實現

public class C01_InScene {
    public static void main(String[] args) {
        Manager manager = new Manager() ;
        EmployeeA employeeA = new EmployeeA("張三",manager) ;
        EmployeeB employeeB = new EmployeeB("李四",manager) ;
        employeeA.sendMsg(employeeA.name,"需要產品文檔",employeeB);
    }
}
/**
 * 部門協調介面
 */
interface Department {
    void coordinate (String userName,String msg,Employee employee) ;
}
/**
 * 部門經理
 */
class Manager implements Department {
    @Override
    public void coordinate (String userName,String msg,Employee employee) {
        System.out.println("經理接收【"+userName+"】的協調任務:" + msg);
        System.out.println("經理轉發【"+userName+"】協調任務,@【"+employee.name+"】");
        employee.getMsg(userName,msg);
    }
}
/**
 * 員工抽象類
 */
abstract class Employee {
    public String name ;
    private Department department ;
    public Employee (String name,Department department){
        this.name = name ;
        this.department = department ;
    }
    public void getMsg (String userName,String msg){
        System.out.println("【"+this.name+"】收到"+"【"+userName+"】協調任務:["+msg+"]");
    }
    public void sendMsg (String name,String msg,Employee employee){
        System.out.println("【"+name+"】發起協調任務:"+ msg);
        department.coordinate(name,msg,employee);
    }
}
/**
 * 具體員工
 */
class EmployeeA extends Employee {
    public EmployeeA(String name, Department department) {
        super(name, department);
    }
}
class EmployeeB extends Employee {
    public EmployeeB(String name, Department department) {
        super(name, department);
    }
}

執行結果

【張三】發起協調任務:需要產品文檔
經理接收【張三】的協調任務:需要產品文檔
經理轉發【張三】協調任務,@【李四】
【李四】收到【張三】協調任務:[需要產品文檔]

二、調停者模式

1、基本概念

調停者模式是對象的行為模式。調停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互顯式引用,通過一個中介對象進行引用通知,從而對象之間解耦。當這些對象中的某些對象之間的相互作用發生改變時,不會立即影響到其他的對象間的相互作用。保證這些相互作用可以彼此獨立地變化。

2、模式圖解

3、核心角色

  • 抽象調停者角色

定義出同事對象到調停者對象的介面,其中主要方法是一個或多個事件方法。

  • 具體調停者角色

實現了抽象調停者所聲明的事件方法。具體調停者持有所有的具體同事類,並負責協調各具體同事對象的交互信息。

  • 抽象同事類角色

定義出調停者到同事對象的介面。同事對象只持有調停者而不知道具體的同事對象。

  • 具體同事類角色

所有的具體同事類均從抽象同事類繼承而來,需要與其他同事通信的時候,就與持有的調停者通信,調停者會負責與其他的同事對象交互。

4、源碼實現

/**
 * 抽象調停者類
 */
interface Mediator {
    void notify (Colleague colleague);
}
/**
 * 抽象同事類
 */
abstract class Colleague {
    /* 持有調停者對象 */
    private Mediator mediator;
    public Colleague(Mediator mediator){
        this.mediator = mediator;
    }
    public Mediator getMediator(){
        return mediator;
    }
}
/**
 * 具體調停者類
 */
class ConcreteMediator implements Mediator{
    private ConcreteColleagueA colleagueA ;
    private ConcreteColleagueB colleagueB ;
    public void setColleagueA(ConcreteColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }
    public void setColleagueB(ConcreteColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }
    @Override
    public void notify(Colleague colleague) {
        System.out.println("協調通知消息");
    }
}
/**
 * 具體同事類
 */
class ConcreteColleagueA extends Colleague{
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }
    public void operate(){
        getMediator().notify(this);
    }
}
class ConcreteColleagueB extends Colleague{
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }
    public void operation(){
        getMediator().notify(this);
    }
}

三、調停者模式總結

  • 鬆散耦合

調停者模式通過把多個同事對象之間的交互封裝到調停者對象裡面,從而使得同事對象之間鬆散耦合。

  • 集中管理交互

多個同事對象的交互,被封裝在調停者對象裡面集中管理,使得這些交互行為發生變化的時候,只需要修改調停者對象就可以了。

  • 簡化對象間關係

沒有使用調停者模式的時候,同事對象之間的關係通常是多對多的,引入調停者對象以後,調停者對象和同事對象的關係通常變成雙向的一對多。

  • 模式的缺點

調停者模式的一個潛在缺點是,過度集中化,當同事對象很多,交互非常、複雜時,會導致調停者對象變得十分複雜,而且難於管理和維護。

四、源代碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 小明是一個很牛逼的程式員,在國際標準化組織工作。 他現在正在設計新一代的C++標準,標準中有一個待實現的函數:findMax(),這個函數要求使用者輸入任何類型的數據,他都能找到最大的一個。 於是他想到了這個: int findMax(int a,int b){ if(a>b){ return a; ...
  • 一.使用的spring boot +mybatis-plus+shiro+maven來搭建項目框架 1 <!--shiro--> 2 <dependency> 3 <groupId>org.apache.shiro</groupId> 4 <artifactId>shiro-core</artifa ...
  • [TOC] 題目 "Largest Rectangle in a Histogram" 思路 單調棧。 不知道怎麼描述所以用樣例講一下。 我們可以用單調棧去維護每一個高度左右第一個比他矮的位置即可 $Code$ ...
  • 入門python一切都感覺到那麼簡單,從來沒有想過人生還可以有這麼美好的待遇,這一切都是因為接觸了python才讓我感到生活原來一切又充滿了希望 ...
  • jdk: 解壓: tar zxvf jdk-8u144-linux-x64.tar.gz 執行:vi /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_201 export CLASSPATH=$JAVA_HOME/lib export PATH=$ ...
  • Day1 考的不是很好,T1T2沒區分度,T3想的太少,考試後期幾乎都是在摸魚,bitset亂搞也不敢打,只拿到了35分,跟前面的差距很大 A. 最大或 標簽: 二進位+貪心 題解: 首先x,y中一定有一個是R,考慮L的取值:對於每一位分為x中有沒有討論: 1>有 如果這一位不加以後全加可以>=L則 ...
  • Scrapy.http.Request 自動去重,根據url的哈希值,進行去重 屬性 meta(dict) 在不同的請求之間傳遞數據,dict priority(int) 此請求的優先順序(預設為0) dont_filter(boolean) 關閉自動去重 errback(callable) 在處理請 ...
  • 一、環境準備 1. jdk1.8.1 做java開發的這個應該能自己找到 2.gradle-4.9 https://services.gradle.org/distributions/ 沒用過gradle的同學可以將其理解為類似於maven的包管理工具,這裡下載gradle-4.9-bin.zip, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...