首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式精講:中介者模式與電腦主板解耦實戰

     編輯:Java 相關知識

模式動機

當多個對象之間形成網狀耦合(每個對象都直接引用其他對象)時,系統難以維護。中介者模式引入一個中介者對象,將網狀結構轉為星形結構:同事對象不再直接通信,而是通過中介者轉發,降低耦合,集中控制交互邏輯。

角色定義

角色職責
Mediator (抽象中介者)定義同事對象通信接口,如 changed(Colleague c)
ConcreteMediator (具體中介者)實現協調邏輯,持有所有同事引用,知曉具體交互細節
Colleague (抽象同事類)持有中介者引用,定義通用行為,需通信時調用 mediator.changed(this)
ConcreteColleague (具體同事類)實現具體業務,發起/響應通信

經典案例:電腦主板協調硬件

無主板時,CPU、顯卡、聲卡、光驅需兩兩直接連接、協議適配,極其複雜。有主板後,所有組件只與主板連接,主板負責數據分發、協議轉換。

代碼實現

1. 抽象同事類

public abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator mediator) { this.mediator = mediator; }
    public Mediator getMediator() { return mediator; }
}

2. 具體同事:光驅、CPU、顯卡、聲卡

public class CDDriver extends Colleague {
    private String data = "";
    public CDDriver(Mediator m) { super(m); }
    public String getData() { return data; }
    public void readCD() {
        data = "One Piece,海賊王我當定了"; // 視頻,音頻
        getMediator().changed(this); // 通知主板
    }
}

public class CPU extends Colleague {
    private String videoData, soundData;
    public CPU(Mediator m) { super(m); }
    public String getVideoData() { return videoData; }
    public String getSoundData() { return soundData; }
    public void executeData(String data) {
        String[] arr = data.split(",");
        videoData = arr[0]; soundData = arr[1];
        getMediator().changed(this); // 通知主板處理完畢
    }
}

public class VideoCard extends Colleague {
    public VideoCard(Mediator m) { super(m); }
    public void showData(String data) { System.out.println("您正在觀看的是:" + data); }
}

public class SoundCard extends Colleague {
    public SoundCard(Mediator m) { super(m); }
    public void soundData(String data) { System.out.println("畫外音:" + data); }
}

3. 抽象中介者

public interface Mediator {
    void changed(Colleague c);
}

4. 具體中介者:主板

public class MainBoard implements Mediator {
    private CDDriver cdDriver;
    private CPU cpu;
    private VideoCard videoCard;
    private SoundCard soundCard;

    public void setCdDriver(CDDriver cd) { this.cdDriver = cd; }
    public void setCpu(CPU cpu) { this.cpu = cpu; }
    public void setVideoCard(VideoCard vc) { this.videoCard = vc; }
    public void setSoundCard(SoundCard sc) { this.soundCard = sc; }

    @Override
    public void changed(Colleague c) {
        if (c instanceof CDDriver)      opeCDDriverReadData((CDDriver) c);
        else if (c instanceof CPU)      opeCPU((CPU) c);
    }

    private void opeCDDriverReadData(CDDriver cd) {
        cpu.executeData(cd.getData()); // 數據傳給 CPU
    }
    private void opeCPU(CPU cpu) {
        videoCard.showData(cpu.getVideoData());
        soundCard.soundData(cpu.getSoundData());
    }
}

5. 客戶端組裝

public class Client {
    public static void main(String[] args) {
        MainBoard mb = new MainBoard();
        CDDriver cd = new CDDriver(mb);
        CPU cpu = new CPU(mb);
        VideoCard vc = new VideoCard(mb);
        SoundCard sc = new SoundCard(mb);

        mb.setCdDriver(cd);
        mb.setCpu(cpu);
        mb.setVideoCard(vc);
        mb.setSoundCard(sc);

        cd.readCD(); // 觸發全鏈路
    }
}

運行輸出

您正在觀看的是:One Piece
畫外音:海賊王我當定了

優缺點分析

優點缺點
鬆耦合:同事對象互不引用,單獨復用容易中介者膨脹:交互邏輯集中導致中介者類過於龐大、難維護
集中控制:修改交互只需改中介者,符合開閉原則單點故障:中介者故障導致整個系統通信癱瘓
多對多 → 一對多:結構清晰,易於理解間接性能開銷:多一次轉發調用

適用場景

  • 多個對象之間相互依賴、交互複雜(網狀結構)。
  • 希望將交互邏輯從業務對象中分離,集中管理。
  • 對象之間的通信行為經常變化,需靈活配置。

對比:中介者 vs 觀察者

  • 觀察者:一對多,發布-訂閱,觀察者不知道主題細節,主題不知觀察者細節,雙向解耦。
  • 中介者:多對多轉一對多,中介者知道所有同事細節,同事只知道中介者,集中式控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved