欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計(jì)模式之中介模式

 更新時(shí)間:2023年12月29日 10:11:39   作者:理想萬(wàn)歲萬(wàn)萬(wàn)歲  
這篇文章主要介紹了Java設(shè)計(jì)模式之中介模式,中介模式(Mediator?Pattern),屬于行為型設(shè)計(jì)模式,目的是把系統(tǒng)中對(duì)象之間的調(diào)用關(guān)系從一對(duì)多轉(zhuǎn)變成一對(duì)一的調(diào)用關(guān)系,以此來(lái)降低多個(gè)對(duì)象和類(lèi)之間的通信復(fù)雜性,需要的朋友可以參考下

一、介紹

中介模式(Mediator Pattern),屬于行為型設(shè)計(jì)模式。目的是把系統(tǒng)中對(duì)象之間的調(diào)用關(guān)系從一對(duì)多轉(zhuǎn)變成一對(duì)一的調(diào)用關(guān)系,以此來(lái)降低多個(gè)對(duì)象和類(lèi)之間的通信復(fù)雜性。

在很多情況下,一個(gè)類(lèi)中對(duì)象于對(duì)象之間的調(diào)用往往很容易形成網(wǎng)狀結(jié)構(gòu),此時(shí)倘若一個(gè)對(duì)象發(fā)生改變,那么將會(huì)導(dǎo)致其他所有與之關(guān)聯(lián)的對(duì)象進(jìn)行修改,從而導(dǎo)致系統(tǒng)復(fù)雜性增加,且難以維護(hù)。

使用中介模式,可以通過(guò)向系統(tǒng)中引入中介類(lèi),將這種網(wǎng)狀結(jié)構(gòu)改為星型結(jié)構(gòu),各個(gè)對(duì)象直接不直接關(guān)聯(lián)而是通過(guò)該中介類(lèi)進(jìn)行交互,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),只需要在中介類(lèi)中做出相應(yīng)的修改即可,其他對(duì)象對(duì)此變化是無(wú)感的。

用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各個(gè)對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。

使用下面圖示可能會(huì)更好的進(jìn)行表達(dá)

在這里插入圖片描述

二、生活中的中介模式

在我們?nèi)粘I钪校幪幋嬖谥薪槟J降挠白印?/p>

房產(chǎn)中介

如果沒(méi)有房產(chǎn)中介,我們需要親自聯(lián)系各個(gè)房東約其看房,既浪費(fèi)自己的時(shí)間也浪費(fèi)各個(gè)房東的時(shí)間;

有了房產(chǎn)中介,我們只需要聯(lián)系中介小哥就行了,中介小哥有各個(gè)房東的鑰匙,直接看房,十分方便。

線(xiàn)上招聘平臺(tái)

在沒(méi)有線(xiàn)上招聘平臺(tái)的情況下,我們要找一家公司應(yīng)聘是一件十分麻煩的事情,要么親自帶著簡(jiǎn)歷去公司詢(xún)問(wèn)是否招聘某崗位(可能因?yàn)椴徽腥硕着芤惶?,要么在網(wǎng)上查找各個(gè)公司的官網(wǎng)招聘頁(yè)以郵箱的形式投遞簡(jiǎn)歷,但甚至很多小公司都沒(méi)有官網(wǎng);

有了線(xiàn)上招聘平臺(tái)后,應(yīng)聘者直接在平臺(tái)上聯(lián)系各個(gè)公司就好了,通過(guò)該平臺(tái),應(yīng)聘者不僅可以看到各種大中小公司,還不會(huì)因?yàn)楣菊衅噶鞒痰母淖兌苡绊?,因?yàn)閼?yīng)聘者在平臺(tái)上的操作都是一樣的。

三、中介模式中的角色

在中介模式中,最重要的角色就是**中介角色(Mediator )**了,它用于在系統(tǒng)中各個(gè)對(duì)象之間建立關(guān)聯(lián)關(guān)系。

抽象中介接口類(lèi)(Mediator)

定義中介的功能。

具體中介類(lèi)(MediatorImpl)

實(shí)現(xiàn)中介接口類(lèi)定義的功能。在實(shí)現(xiàn)的功能邏輯中,給各個(gè)對(duì)象建立關(guān)聯(lián)關(guān)系,因此中介類(lèi)中需要維護(hù)一個(gè)包含關(guān)聯(lián)的各個(gè)組件的集合并對(duì)該集合進(jìn)行維護(hù)。

系統(tǒng)組件抽象接口類(lèi)(Component)

定義系統(tǒng)中各個(gè)對(duì)象的功能。

系統(tǒng)組件具體實(shí)現(xiàn)類(lèi)(AComponent、BComponent、CComponent)

實(shí)現(xiàn)各個(gè)對(duì)象的功能。

通過(guò)對(duì)中介模式中各個(gè)角色的分析,可得其通用UM圖如下所示

在這里插入圖片描述

四、案例演示

群發(fā)消息為例,每當(dāng)我們?cè)谥卮髠鹘y(tǒng)節(jié)日時(shí),許多人喜歡使用短信群發(fā)的形式,將節(jié)日祝福一次性群發(fā)給他的親朋好友們。這是一個(gè)非常好的案例,在沒(méi)有群發(fā)功能的時(shí)候,我們想好一段祝福語(yǔ)后,需要一個(gè)接一個(gè)地對(duì)通訊錄中的朋友進(jìn)行發(fā)送短信(一對(duì)多);而后來(lái)有了群發(fā)功能后,我們選擇群發(fā)功能,將親朋好友都添加到這個(gè)功能中作為群發(fā)聯(lián)系人,然后點(diǎn)擊發(fā)送短信就可以將祝福發(fā)送給所有人了(一對(duì)一)。此時(shí)群發(fā)功能就相當(dāng)于中介。

1. 角色分析

聯(lián)系人接口(Friend)

定義聯(lián)系人的功能。在節(jié)日祝福中,我們通訊錄中的聯(lián)系人有個(gè)接收短信功能receiveMessage()就夠了。

public interface Friend {

    void receiveMessage(String message);
}

具體聯(lián)系人(FriendImpl)

實(shí)現(xiàn)聯(lián)系人接口(Friend)定義的功能。假設(shè)聯(lián)系人有三個(gè):父親、母親、姐姐。

public class Father implements Friend{
    @Override
    public void receiveMessage(String message) {
        System.out.println("父親收到短信:" + message);
    }
}
public class Mother implements Friend{
    @Override
    public void receiveMessage(String message) {
        System.out.println("母親收到短信:" + message);
    }
}
public class Sister implements Friend{
    @Override
    public void receiveMessage(String message) {
        System.out.println("姐姐收到短信:" + message);
    }
}

抽象群發(fā)接口(SendGroup)

定義一個(gè)發(fā)送功能send(),以及對(duì)群發(fā)目標(biāo)聯(lián)系人的維護(hù)功能addFriend()、removeFriend()。

public interface SendGroup {
    void addFriend(Friend friend);
    void removeFriend(Friend friend);
    void send(String message);
}

具體群發(fā)中介類(lèi)(SendGroupImpl)

實(shí)現(xiàn)抽象群發(fā)接口SendGroup定義的功能。前面分析中說(shuō)過(guò),中介類(lèi)中需要維護(hù)一個(gè)包含所有聯(lián)系人的集合并對(duì)其進(jìn)行維護(hù)。

public class SendGroupImpl implements SendGroup{
    private final List<Friend> friendList = new ArrayList<>();
    @Override
    public void addFriend(Friend friend) {
        if (!friendList.contains(friend)) {
            friendList.add(friend);
        }
    }
    @Override
    public void removeFriend(Friend friend) {
        friendList.remove(friend);
    }
    @Override
    public void send(String message) {
        for (Friend friend : friendList) {
            friend.receiveMessage(message);
        }
    }
}

客戶(hù)端(MediatorClient)

新建一個(gè)客戶(hù)端類(lèi)對(duì)該案例進(jìn)行演示

public class MediatorClient {
    public static void main(String[] args) {
        Friend father = new Father();
        Friend mother = new Mother();
        Friend sister = new Sister();
        // 選擇需要群發(fā)短信的聯(lián)系人
        SendGroup sendGroup = new SendGroupImpl();
        sendGroup.addFriend(father);
        sendGroup.addFriend(mother);
        sendGroup.addFriend(sister);
        // 群發(fā)短信
        sendGroup.send("新年快樂(lè)");
    }
}

運(yùn)行該代碼后得到以下輸出

在這里插入圖片描述

五、優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 通過(guò)引入中介類(lèi),將對(duì)象之間的關(guān)系從一對(duì)多變成了一對(duì)一
  • 將各個(gè)類(lèi)進(jìn)行解耦

缺點(diǎn):

對(duì)客戶(hù)端的代碼維護(hù),轉(zhuǎn)變?yōu)閷?duì)中介類(lèi)的維護(hù),中介類(lèi)變得龐大時(shí)也將同樣難以維護(hù)。

到此這篇關(guān)于Java設(shè)計(jì)模式之中介模式的文章就介紹到這了,更多相關(guān)Java中介模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談SpringMVC+Spring3+Hibernate4開(kāi)發(fā)環(huán)境搭建

    淺談SpringMVC+Spring3+Hibernate4開(kāi)發(fā)環(huán)境搭建

    MVC已經(jīng)是現(xiàn)代Web開(kāi)發(fā)中的一個(gè)很重要的部分,本文介紹一下SpringMVC+Spring3+Hibernate4的開(kāi)發(fā)環(huán)境搭建,有興趣的可以了解一下。
    2017-01-01
  • 詳解Spring工廠特性

    詳解Spring工廠特性

    今天帶大家學(xué)習(xí)Spring的特性-工廠特性,文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • java中數(shù)組的應(yīng)用及方法

    java中數(shù)組的應(yīng)用及方法

    本篇文章介紹了,java中數(shù)組的應(yīng)用及方法。需要的朋友參考下
    2013-04-04
  • 詳解Java泛型及其應(yīng)用

    詳解Java泛型及其應(yīng)用

    這篇文章主要介紹了Java泛型及其應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JPA配置方式+逆向工程映射到Entity實(shí)體類(lèi)

    JPA配置方式+逆向工程映射到Entity實(shí)體類(lèi)

    這篇文章主要介紹了JPA配置方式+逆向工程映射到Entity實(shí)體類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式

    idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式

    這篇文章主要介紹了idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java實(shí)現(xiàn)數(shù)字轉(zhuǎn)成英文的方法

    Java實(shí)現(xiàn)數(shù)字轉(zhuǎn)成英文的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)數(shù)字轉(zhuǎn)成英文的方法,涉及java數(shù)組與字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • 詳解Spring AOP的實(shí)現(xiàn)方式

    詳解Spring AOP的實(shí)現(xiàn)方式

    AOP是一種思想,是對(duì)某一類(lèi)事情的集中處理,切面就是指某一類(lèi)特定的問(wèn)題,所以AOP可以理解為面向特定方法編程,這篇文章主要介紹了Spring AOP的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2024-02-02
  • Java中泛型的示例詳解

    Java中泛型的示例詳解

    泛型機(jī)制在項(xiàng)目中一直都在使用,不僅如此,很多源碼中都用到了泛型機(jī)制。本文將通過(guò)一些示例帶大家深入了解一下Java的泛型機(jī)制,需要的可以了解一下
    2022-10-10
  • 非常適合新手學(xué)生的Java線(xiàn)程池超詳細(xì)分析

    非常適合新手學(xué)生的Java線(xiàn)程池超詳細(xì)分析

    作者是一個(gè)來(lái)自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請(qǐng)指正,將來(lái)會(huì)不斷的完善筆記,幫助更多的Java愛(ài)好者入門(mén)
    2022-03-03

最新評(píng)論