雖然面向?qū)ο蠊膭?lì)將行為分布到各個(gè)對(duì)象中,把對(duì)象劃分成更小的粒度有利于對(duì)象可復(fù)用性,但有時(shí)對(duì)象之間聯(lián)系太多又會(huì)反而降低可復(fù)用性
通過(guò)一個(gè)中介者對(duì)象封裝一組對(duì)象之間的交互,減少對(duì)象間直接耦合,對(duì)象之間的通信集中在中介者對(duì)象中,使得對(duì)象間交互更加簡(jiǎn)單和可控
反例
舉個(gè)例子,5 v 5 玩家對(duì)戰(zhàn)游戲設(shè)計(jì)中,我們要?jiǎng)?chuàng)建角色 Player 對(duì)象
- 當(dāng)玩家死亡時(shí),我們需要遍歷所有隊(duì)友,如果都死亡了就通知所有敵人游戲勝利、通知己方所有人游戲失敗
我們首先想到可以通過(guò)創(chuàng)建玩家角色 Factory 工廠提高初始化角色時(shí)的效率,但這并不能解決對(duì)象和對(duì)象間的耦合關(guān)系,隨著玩家數(shù)量變成5、變成10、變成20,遍歷一遍所有角色會(huì)嚴(yán)重降低效率
如果角色還要有切換陣營(yíng)、離開(kāi)隊(duì)伍功能,那這就更令人惱火了
實(shí)現(xiàn)
我們?cè)囍堰@個(gè)收發(fā)信息、通知?jiǎng)倮墓δ苡靡粋€(gè)中介者來(lái)管理,這是一個(gè)最基礎(chǔ)的例子,只實(shí)現(xiàn)了收發(fā)信息功能,當(dāng)然還可以實(shí)現(xiàn)管理游戲輸贏、比分等等~
// 抽象的中介者
public abstract class Mediator
{
public abstract void SendMessage(string message, Player sender);
}
// 具體的中介者
public class GameMediator : Mediator
{
private Dictionary<string, Player> players = new Dictionary<string, Player>();
public void RegisterPlayer(Player player)
{
players[player.Name] = player;
}
public override void SendMessage(string message, Player sender)
{
foreach (var player in players.Values)
{
if (player != sender)
{
player.ReceiveMessage(message);
}
}
}
}
// 抽象玩家,擁有玩家的基本屬性
public abstract class Player
{
protected Mediator mediator;
public string Name { get; private set; }
public Player(string name, Mediator mediator)
{
Name = name;
this.mediator = mediator;
}
public void Send(string message)
{
mediator.SendMessage(message, this);
}
public abstract void ReceiveMessage(string message);
}
// 具體玩家,在這里初始化成紅隊(duì)、藍(lán)隊(duì)
public class PlayerImpl : Player
{
public PlayerImpl(string name, Mediator mediator) : base(name, mediator)
{
}
public override void ReceiveMessage(string message)
{
Console.WriteLine($"{Name} received message: {message}");
}
}
class Program
{
static void Main(string[] args)
{
GameMediator mediator = new GameMediator();
Player player1 = new PlayerImpl("Player1", mediator);
Player player2 = new PlayerImpl("Player2", mediator);
Player player3 = new PlayerImpl("Player3", mediator);
mediator.RegisterPlayer(player1);
mediator.RegisterPlayer(player2);
mediator.RegisterPlayer(player3);
player1.Send("Hello, everyone!");
player2.Send("Hey, Player1!");
}
}
迪米特法則
又叫最小知識(shí)原則,是指一個(gè)對(duì)象應(yīng)該盡可能少的了解其他對(duì)象。如果對(duì)象之間耦合度太高,一個(gè)對(duì)象發(fā)生改變之后難免會(huì)影響其他對(duì)象
其中中介者模式最大的缺點(diǎn)就是新增了一個(gè)中介者對(duì)象,對(duì)象之間的復(fù)雜度全部轉(zhuǎn)移到中介者身上,最后會(huì)導(dǎo)致中介者對(duì)象變得異常復(fù)雜文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-726665.html
我們寫(xiě)程序是為了快速完成項(xiàng)目交付生產(chǎn),而不是堆砌模式和過(guò)度設(shè)計(jì),對(duì)象和模塊之間有一些依賴(lài)關(guān)系是正常的,如果對(duì)象之間的復(fù)雜耦合導(dǎo)致了調(diào)用和維護(hù)困難,我們就可以考慮使用中介者模式來(lái)重構(gòu)代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-726665.html
到了這里,關(guān)于通過(guò)簡(jiǎn)單的中介者模式模型了解迪米特法則(設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐 P14)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!