【設計模式】(二十五)--行爲型模式--中介者模式

【設計模式】(二十五)–行爲型模式–中介者模式

中介者模式定義

Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly. and it lets you vary their interaction independently.

意思是:用一箇中介對象封裝一系列對象的交互,中介者使各對象不需要顯示的相互作用,從而使其鬆散耦合,而且可以獨立地改變它們之間的交互。
中介者模式一般有4個元素:

  • Mediator 抽象中介者,定義了同事對象到中介者對象的統一接口,用於各個同事角色之間的通信。
  • Concrete Mediator 具體中介者,實現了中介者聲明的操作,依賴於各個同事角色,並通過協調各個同事實現協作行爲。
  • Colleague 抽象同事,定義了中介者到同事對象的接口,同事對象只知道中介者而不知道其餘同事對象。
  • Concrete Colleague 具體同事,實現了同事接口的具體類,每一個具體同事類都清楚自己範圍內的行爲,但是不清楚擴大範圍後的目的。

中介者模式的優點

  • 1、降低了類的複雜度,將一對多轉化成了一對一。
  • 2、各個類之間的解耦,各個同事類只依賴於中介者,使得同事類更容易複用,中介者類和同事類都可以相對獨立的演化。
  • 3、符合迪米特原則。

中介者模式雖然降低了同事對象的複雜性,但是中介者類還要處理協調事務大大的增加了終結者類的複雜性,中介者類不注意很容易膨脹到難以維護。所以要注意一下情況:

  • 不應當在責任劃分混亂時使用。尤其是在系統設計之初,需求不大確定時,直接引入中介者,責任劃分的不清,很可能會導致對象之間關係混亂,系統難以維護。
  • 合理的使用封裝,不應當對數據類和方法類使用。

中介者模式的使用場景

  • 1、系統中對象之間存在比較複雜的引用關係,導致它們之間的依賴關係結構混亂而且難以複用該對象。
  • 2、想通過一箇中間類來封裝多個類中的行爲,而又不想生成太多的子類。

中介者模式的簡單實現

類圖
在這裏插入圖片描述

實現

public class Test {
    public static void main(String[] args) {
        BeiWaiHeros beiWaiHeros = new BeiWaiHerosImpl();
        User user = new Gamer("大少", "射手", beiWaiHeros);
        User user1 = new Gamer("大少小號1", "坦克", beiWaiHeros);
        User user2 = new Gamer("大少小號2", "法師", beiWaiHeros);
        User user3 = new Gamer("二少", "戰士", beiWaiHeros);
        User user4 = new Gamer("二少小號1", "輔助", beiWaiHeros);


        user.willPlay();
        user1.willPlay();
        user2.willPlay();
        user3.willPlay();
        user4.willPlay();

        User user5 = new Gamer("三少", "刺客", beiWaiHeros);
        User user6 = new Gamer("三少", "法師", beiWaiHeros);

    }
}
public interface BeiWaiHeros {
    void login(User user);

    void match(User user);
}
public class BeiWaiHerosImpl implements BeiWaiHeros {

    List<User> onlineUser = new ArrayList<>();

    List<User> matchingUser = new ArrayList<>();

    int playingCount = 0;

    private final int COUNT = 4;

    private final String RED = "紅色方";
    private final String BLUE = "藍色方";

    @Override
    public void login(User user) {
        onlineUser.add(user);
        System.out.println("登錄成功,在線人數:" + onlineUser.size() + "," + playingCount + "玩家正在遊戲中!");
    }

    @Override
    public void match(User user) {
        matchingUser.add(user);
        if (COUNT == matchingUser.size()) {
            playingCount = playingCount + COUNT;
            System.out.println("遊戲匹配成功!遊戲開始");
            matchingUser.clear();
            return;
        }
        int estimateTime = (COUNT - matchingUser.size()) * 2;
        System.out.println("正在匹配人數" + matchingUser.size() + "玩家" + user.getName() + ",預計需要等待" + estimateTime + "秒!");
    }
}
public abstract class User {
    private String name;
    private String commonlyHero;
    BeiWaiHeros beiWaiHeros;
    private String camp;

    public User(String name, String commonlyHero, BeiWaiHeros beiWaiHeros) {
        this.name = name;
        this.commonlyHero = commonlyHero;
        this.beiWaiHeros = beiWaiHeros;
        beiWaiHeros.login(this);
    }

    public void setCamp(String camp) {
        this.camp = camp;
    }

    public void willPlay() {
        beiWaiHeros.match(this);
    }

    public String getName() {
        return name;
    }
}
public class Gamer extends User {

    public Gamer(String name, String commonlyHero, BeiWaiHeros beiWaiHeros) {
        super(name, commonlyHero, beiWaiHeros);
    }
}

結果
在這裏插入圖片描述
實現說明,通過一個BeiWaiHeros遊戲,BeiWaiHeros遊戲是一個2v2的pvp遊戲,實現中介者模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章