說明:
當物件和物件之間或有錯綜複雜的交互作用,可將這些關係交由另一物件(中介者)來處理,
以減少這些物件間的耦合。
範例:
有一個醫護兵物件、一個步兵物件(屬於同事物件),能發出不同的訊息,
中介者物件則負責這些訊息要如何處理、要再傳遞給誰。
希望達成如下的效果
static void Main(string[] args)
{
ConcreteMediator mediator = new ConcreteMediator(); // 中介者
MedicColleague medic = new MedicColleague("小護士", mediator); // 醫護兵
InfantryColleague infantry = new InfantryColleague("小小強", mediator); // 步兵
medic.Send("normal", "吹東風了");
infantry.Send("normal", "左前方一隻小白兔走過去");
medic.Send("attack", "遭受敵人攻擊");
infantry.Send("hurt", "我中彈了");
Console.Read();
}
執行結果: 中介者 接收到 小護士 訊息:吹東風了 => 訊息處理 小小強 接收到 小護士 訊息:吹東風了 中介者 接收到 小小強 訊息:左前方一隻小白兔走過去 => 訊息處理 小護士 接收到 小小強 訊息:左前方一隻小白兔走過去 中介者 接收到 小護士 訊息:遭受敵人攻擊 => 訊息處理 小小強 接收到 小護士 訊息:遭受敵人攻擊。前往救助中 中介者 接收到 小小強 訊息:我中彈了 => 訊息處理 小護士 接收到 小小強 訊息:我中彈了。前往救護中
實現重點在於,同事物件(醫護兵物件、步兵物件)發出訊息時,其實是丟給中介者物件,再由中介者物件負責訊息要再傳遞給誰。
其餘程式碼
// 中介者抽像類別
abstract class Mediator
{
protected MedicColleague medic; // 醫護兵
protected InfantryColleague infantry; // 步兵
// 設定醫護兵
public MedicColleague Medic
{
set { medic = value; }
}
// 設定步兵
public InfantryColleague Infantry
{
set { infantry = value; }
}
public abstract void Work(string msgType, string msgCon, Colleague colleague);
}
// 中介者
class ConcreteMediator : Mediator
{
// 中介者處理接收到的訊息
public override void Work(string msgType, string msgCon, Colleague colleague)
{
Console.WriteLine("中介者 接收到 {0} 訊息:{1} => 訊息處理", colleague.Name, msgCon);
switch (msgType)
{
case "hurt":
this.medic.Action(msgCon, colleague);
break;
case "attack":
this.infantry.Action(msgCon, colleague);
break;
case "normal":
if (colleague != this.medic) this.medic.Receive(msgCon, colleague);
if (colleague != this.infantry) this.infantry.Receive(msgCon, colleague);
break;
}
}
}
// 同事抽象類別
abstract class Colleague
{
protected string name; // 姓名
protected Mediator mediator; // 中介者
// 設定姓名、中介者
public Colleague(string name, Mediator mediator)
{
this.name = name;
this.mediator = mediator;
}
public string Name
{
get { return name; }
set { name = value; }
}
// 發送訊息給中介者
public void Send(string msgType, string msgCon)
{
mediator.Work(msgType, msgCon, this);
}
// 接收一般訊息
public void Receive(string msgCon, Colleague colleague)
{
Console.WriteLine("{0} 接收到 {1} 訊息:{2}", this.name, colleague.Name, msgCon);
}
}
// 醫護兵
class MedicColleague : Colleague
{
public MedicColleague(string name, Mediator mediator)
: base(name, mediator)
{
mediator.Medic = this;
}
// 醫療行動
public void Action(string msgCon, Colleague colleague)
{
Console.WriteLine("{0} 接收到 {1} 訊息:{2}。前往救護中", this.name, colleague.Name, msgCon);
}
}
// 步兵
class InfantryColleague : Colleague
{
public InfantryColleague(string name, Mediator mediator)
: base(name, mediator)
{
mediator.Infantry = this;
}
// 攻擊行動
public void Action(string msgCon, Colleague colleague)
{
Console.WriteLine("{0} 接收到 {1} 訊息:{2}。前往救助中", this.name, colleague.Name, msgCon);
}
}
相關連結:設計模式整理列表
這邊真是個寶庫,感謝大大的文章。
回覆刪除其他在這裡有所收穫的人,別害羞,給作者一個讚美吧