最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式之中介者模式

 更新時間:2022年10月11日 09:00:45   作者:tianClassmate  
這篇文章介紹了Java設計模式之中介者模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在我們實際業(yè)務中,可能存在多個類之間相互調用,形成了一個復雜的網狀結構。這時候就需要有一種模式去“捋順”他們之間的關系,引出一個中間者讓類之間不再相互調用,該模式就是我們今天的主人公——中介者模式。

一、概念理解

我們先看中介者模式的官方概念:用一個中介者對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其松散耦合,而且可以獨立地改變它們之間的交互。

大白話解釋就是,引入一個“中介”,用于協調各個對象的關系,各個對象之間不用那么直白的直接調,對象只需要調用中介的方法,中介內部進行邏輯判斷,由中介去調用各個對象的方法。

概念基本清楚以后接著看中介者模式包含的角色都有哪些:

中介者角色、各個對象角色是必須的,在面向接口編程原則下,中介者和對象應該抽離出來接口,于是在中介者模式的結構中就包括四種角色(各個對象角色稱為同事):

1.中介者(Mediator):中介者是一個接口,該接口定義了用于同事(Colleague)對象之間進行通信的方法;

2.具體中介者(ConcreteMediator):具體中介者是實現中介者接口的類。具體中介者需要包含所有具體同事(ConcreteColleague)的引用,并通過實現中介者接口中的方法來滿足具體同事之間的通信要求;

3.同事(Colleague):一個接口,規(guī)定了具體同事需要實現的方法;

4.具體同事(ConcreteColleague):實現了同事接口的類。具體同事需要包含具體中介者的引用,一個具體同事需要和其他具體同事交互時,只需將自己的請求通知給它所包含的具體中介者的引用。

如果在一個業(yè)務場景中,一個公司有很多同事,同事1 管理的有自己的數據,有時候也會調用同事2的數據。

在中介者模式下,同事1和同事2 之間不再相互調用,由中介者統一調用,同事類中要持有中介者對象,中介者方法中要有判斷屬于哪個角色的方法。

基于四個角色,實現初試的demo。

讀者可以拉取完整代碼到本地進行學習,實現代碼均測試通過后上傳到碼云。

本地源碼下載

二、案例實現

抽象同事類:

抽象同事中要持有中介者的引用

/**
 * 抽象同事類
 * @author tcy
 * @Date 14-09-2022
 */
public abstract class Colleague {

    //抽象中介者引用
    protected Mediator mediator;

    public Colleague(Mediator mediator)
    {
        this.mediator = mediator;
    }
    //數據更新方法
    public abstract void update();
    //數據更改方法
    public abstract void changed();
}

具體同事類1、2:

具體同事類除了有自己的業(yè)務邏輯之外,應該還有額外調用中介者的方法

/**
 * 具體同事2
 * @author tcy
 * @Date 14-09-2022
 */

public class ConcreteColleague2 extends Colleague {

    public ConcreteColleague2(Mediator mediator)
    {
        super(mediator);
    }

    //自己的方法
    @Override
    public void update()
    {
        System.out.println("更新同事類2");
    }

    //調用同事的方法
    @Override
    public void changed()
    {
        System.out.println("同事類2數據更改");
        mediator.operation(this);
    }

}

/**
 * 具體同事1
 * @author tcy
 * @Date 14-09-2022
 */
public class ConcreteColleague1 extends Colleague{

    public ConcreteColleague1(Mediator mediator)
    {
        super(mediator);
    }

    @Override
    public void update()
    {
        System.out.println("更新同事類1");
    }

    @Override
    public void changed()
    {
        System.out.println("同事類1數據更改");
        mediator.operation(this);
    }


}

抽象中介者:

抽象中介者應該是持有所有同事對象,并且應該有一個方法去調用別的同事

/**
 * 抽象中介者
 */
public abstract class Mediator {

    protected ArrayList<Colleague> colleagues = new ArrayList<>();

    public void add(Colleague colleague)
    {
        colleagues.add(colleague);
    }

    public abstract void operation(Colleague colleague);

}

具體中介者:

具體中介者實現抽象中介者的方法,根據條件調用不同的同事

/**
 * 具體中介者
 * @author tcy
 * @Date 14-09-2022
 */
public class ConcreteMediator extends Mediator {

    @Override
    public void operation(Colleague colleague)
    {
        if(colleague instanceof ConcreteColleague1)
            colleagues.get(1).update();
        else if(colleague instanceof ConcreteColleague2)
            colleagues.get(0).update();
    }

}

三、中介者模式源碼中的應用

中介者模式的典型應用就是Jdk中的Timer 類。

我們知道Timer 類的主要作用是用于定時任務,定時任務之間會存在通信問題,如果眾多的定時任務都相互通信,那對于系統對象間的引用來說就是一災難,引出中介者模式就是理所應當的了。

當有新的任務加入到隊列中,均把該任務當做同事,各個任務之間的通信都是由Timer 類來完成,Timer 類就相當于中介者的角色。

我們知道,Timer 類實現定時任務的主要方法就是schedule(),schedule()有一堆的重載方法。

我們點開任意的schedule方法。

public void schedule(TimerTask task, Date firstTime, long period) {
    if (period <= 0)
        throw new IllegalArgumentException("Non-positive period.");
    sched(task, firstTime.getTime(), -period);
}

均調用了sched()私有方法。

我們重點看紅線標記的代碼塊,將任務放入一個 隊列中,這個隊列和我們例子中的Arrlist是一個作用。

private final TaskQueue queue = new TaskQueue();

判斷以后,調用Object的notify()方法,進行線程間的通信。

試想一下,如果沒有這個中介,每個定時任務都手動的調用notify()方法,該有多么痛苦。

四、總結

網上講解設計模式的文章很多,能把中介模式講清楚很簡單,但能說明白何時使用合適的設計模式卻是難上加難。在前三章設計模式的基礎之上,第四章總結看完,希望讀者能對正確使用設計模式有一個清晰的輪廓。

很多網上的博客都說要職責清晰才可使用中介者模式,如果類的職責是混亂的,那中介者的邏輯寫起來就很難受。還有多個對象間耦合嚴重,類圖之間出現了網狀結構,這時候就可以考慮中介者模式了,如果僅僅是為了使用中介者模式而使用,那就得不償失了。

中介者的優(yōu)點突出,中介者模式的出現會讓網狀結構,有序的轉化為星狀結構。能有序降低類的復雜度,將多對多的關系轉化為一對多,降低了類之間的耦合。

缺點也很明顯,會增加類的個數,同事類越多,中介者的邏輯也就越復雜。

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

  • 一文搞懂Java中的反射機制

    一文搞懂Java中的反射機制

    這篇文章主要介紹了Java中反射機制的相關資料,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-08-08
  • Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法示例

    Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法示例

    這篇文章主要介紹了Java BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類用法,結合實例形式詳細分析了Java使用BigInteger類,BigDecimal類,Date類,DateFormat類及Calendar類進行數值運算與日期運算相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • Spring后處理器詳細介紹

    Spring后處理器詳細介紹

    Bean后置處理器允許在調用初始化方法前后對Bean進行額外的處理??梢栽?Spring容器通過插入一個或多個BeanPostProcessor的實現來完成實例化,配置和初始化一個?bean?之后實現一些自定義邏輯回調方法
    2023-02-02
  • 基于java socket實現 聊天小程序

    基于java socket實現 聊天小程序

    這篇文章主要介紹了基于java socket實現 聊天小程序,代碼分為服務器和客戶端,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Spring線程池ThreadPoolExecutor配置并且得到任務執(zhí)行的結果

    Spring線程池ThreadPoolExecutor配置并且得到任務執(zhí)行的結果

    今天小編就為大家分享一篇關于Spring線程池ThreadPoolExecutor配置并且得到任務執(zhí)行的結果,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java后端實現異步編程的9種方式總結

    Java后端實現異步編程的9種方式總結

    我們日常開發(fā)的時候,經常說到異步編程,比如說,在注冊接口,我們在用戶注冊成功時,用異步發(fā)送郵件通知用戶,那么實現異步編程一共有多少種方式呢,下面小編就來簡單講講吧
    2025-03-03
  • Java Arrays.AsList原理及用法實例

    Java Arrays.AsList原理及用法實例

    這篇文章主要介紹了Java Arrays.AsList原理及用法實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • JAVA collection集合之撲克牌游戲實例

    JAVA collection集合之撲克牌游戲實例

    本篇文章主要介紹了JAVA collection集合之撲克牌游戲實例,使用了collection集合開發(fā)小游戲,有需要的可以了解一下。
    2016-11-11
  • Java多線程 Producer and Consumer設計模式

    Java多線程 Producer and Consumer設計模式

    這篇文章主要介紹了Java多線程 Producer and Consumer設計模式,producer是生產者的意思:指生產數據的線程,consumer是消費者的意思,指的是使用數據的線程,下文圍繞Producer及Consumer展開話題,需要的朋友可以參考一下
    2021-10-10
  • VScode+Java配置與使用的詳細步驟

    VScode+Java配置與使用的詳細步驟

    這篇文章主要介紹了VS code+Java配置與使用的詳細步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11

最新評論

灵宝市| 余江县| 浦县| 绍兴市| 宝应县| 当涂县| 吉安县| 兴国县| 阿拉善右旗| 讷河市| 福建省| 鄂伦春自治旗| 通许县| 厦门市| 呼和浩特市| 丽江市| 肃南| 若羌县| 贵南县| 临夏市| 黄梅县| 抚松县| 三原县| 通江县| 芮城县| 贵州省| 凤城市| 资中县| 新竹县| 额尔古纳市| 沁阳市| 尼勒克县| 和龙市| 名山县| 博乐市| 临汾市| 象山县| 张家界市| 嘉峪关市| 土默特左旗| 东阿县|