中介者模式-Mediator Pattern(Java實現)

来源:https://www.cnblogs.com/noKing/archive/2018/05/21/9065414.html
-Advertisement-
Play Games

中介者模式, Mediator Pattern, Java實現 ...


中介者模式-Mediator Pattern

終結者模式用於各同事角色之間的通信。

本文的例子: 小組中又很多成員, 一個成員做一件事情後會通知給其他成員, 讓其他成員採取措施.

但是一個人做了一件事情後, 如果要親自通知給小組裡的所有其他人, 那麼就太費勁了, 此時需要一個中介者來完成小組內的通信.

Action枚舉

事件的定義.

public enum Action {

    HUNT("做好了飯", "來吃飯"),
    TALE("要講故事", "來聽故事"),
    FOND("發現了鮮花", "來觀賞");

    private String title;
    private String description;

    Action(String title, String description) {
        this.title = title;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return title;
    }
}  

GroupMember介面

小組成員的定義

public interface GroupMember {

    void joinedParty(Group group);

    void partyAction(Action action);

    void act(Action action);
}

GroupMemberBase抽象類

小組成員的抽象封裝

public abstract class GroupMemberBase implements GroupMember {

    protected Group group;

    @Override
    public void joinedParty(Group group) {
        System.out.printf("%s 加入到了小組中\n", this);
        this.group = group;
    }

    @Override
    public void partyAction(Action action) {
        System.out.printf("%s %s\n", this, action.getDescription());
    }

    @Override
    public void act(Action action) {
        if (group != null) {
            System.out.printf("%s %s\n", this, action);
            group.act(this, action);
        }
    }

    @Override
    public abstract String toString();

}

Andersen類

安徒生, 一個會講故事的男人, 他繼承了GroupMemberBase抽象類, 他可以加入到某個小組中.

public class Andersen extends GroupMemberBase {

    @Override
    public String toString() {
        return "安徒生";
    }
}

Chef類

一名廚師,他也可以加入到某個小組中

public class Chef extends GroupMemberBase {

    @Override
    public String toString() {
        return "廚師";
    }
}  

Fairy類

小精靈, 他也可以加入到某個群組中

public class Fairy extends GroupMemberBase {

    @Override
    public String toString() {
        return "小精靈";
    }
}

Group介面

中介者的抽象定義

public interface Group {

    void addMember(GroupMember member);

    void act(GroupMember actor, Action action);

}

GroupMediator類

小組的中介者, 可以添加成員, 也可以做到本文開頭中說的"通知給其他人"這件事.

import java.util.ArrayList;
import java.util.List;

public class GroupMediator implements Group {

    private final List<GroupMember> members;

    public GroupMediator() {
        members = new ArrayList<>();
    }

    @Override
    public void act(GroupMember actor, Action action) {
        for (GroupMember member : members) {
            if (!member.equals(actor)) {
                member.partyAction(action);
            }
        }
    }

    @Override
    public void addMember(GroupMember member) {
        members.add(member);
        member.joinedParty(this);
    }
}

Main

public class Main {
    public static void main(String[] args) {
        // 創建一個小組
        Group party = new GroupMediator();

        // 有三種人
        Andersen andersen = new Andersen();
        Fairy fairy = new Fairy();
        Chef chef = new Chef();

        // 這三種人都加入到了小組中
        party.addMember(andersen);
        party.addMember(fairy);
        party.addMember(chef);
        System.out.println("-------------------");

        // 安徒生要講故事, 中介者就會通知其他人.
        andersen.act(Action.TALE);
        System.out.println("-------------------");

        // 精靈發現了鮮花, 中介者就會通知其他所有人
        fairy.act(Action.FOND);
        System.out.println("-------------------");

        //廚師做好了飯, 中介者就會通知其他所有人
        chef.act(Action.HUNT);
    }
}

 結果如下:

 


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

-Advertisement-
Play Games
更多相關文章
  • 最近突然想做一些好玩的東西,找來找去,想到了之前曾經在網上看到過有人用box-shadow畫了一副蒙娜麗莎出來感覺這個挺有意思,正好趁著周末,自己也搞一波 前言 線上地址: 優化前的版本優化後的版本源碼倉庫地址 不建議上傳大圖片。。喜歡聽電腦引擎聲的除外 首先,並不打算單純的實現某一張圖片(這樣太沒 ...
  • 命名捕獲 語法 : ?<name> 一:舉個慄子 我們要把從2018-05-20取出年月日 1:普通方法 1 let str = '2018-05-20'; 2 let reg1 = /(\d{4})-(\d{2})-(\d{2})/; 3 let arr = str.match(reg1); 4 ...
  • 思考與總結 1.模塊化 曾看到某大牛說:模塊化和組件化是前端開發的一大趨勢。所謂的模塊化一般是指為了實現一個特定的功能而將所有的代碼(對象)封裝成一個模塊。而AMD就是requireJS為指定模塊規範化的一個產出,它具有非同步載入、依賴前置、提前執行的特點。CMD則是針對淘寶提技術團隊sea.js的一 ...
  • vue2.0 實現導航守衛(路由守衛) 路由跳轉前做一些驗證,比如登錄驗證,是網站中的普遍需求。 對此,vue-route 提供的 beforeRouteUpdate 可以方便地實現導航守衛(navigation-guards)。 導航守衛(navigation-guards)這個名字,聽起來怪怪的 ...
  • 最近有一門課結束了,需要做一個井字棋的游戲,我用JavaScript寫了一個。首先界面應該問題不大,用html稍微寫一下就可以。主要是人機對弈時的ai演算法,如何使電腦方聰明起來,是值得思考一下的。開始游戲後,由玩家先行。那麼站在電腦的角度,可以對多種情況進行分析,並按照重要程度賦予權值。情況如下: ...
  • UML類圖關係圖示,因為長得都很類似,所以大家總會混淆,本文主要目的就是分析一下6種主要的關係,找到聯繫與區別,便於記憶。 6種主要的關係如圖1所示。繼承與實現、組合與聚合、關聯與依賴可分別劃分為一組,每組兩種關係很近似(內涵和圖示都很近似),但聯繫的強弱程度遞減。比如,組合是一個有機組成,缺一不可 ...
  • ...
  • 思想拆分URL分層模塊化雲服務結構ECS雲計算的優勢------------------------------------------------------------------今天先到這兒,希望對您技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...