在VS項目開發過程中,我們創建一個頁面後,系統爲我們自動生成一些代碼(.aspx,.cs),一個用於前臺控件的擺放、另一個用於編寫控件對應的事件操作。例如:我們在雙擊按鈕後,系統自動生成一段Click的代碼並在裏面填寫我們想要的操作。爲什麼界面上很多的按鈕他們相互之間的操作都互不受影響?因爲控件在操作的時候,不是自己操作自己,而是產生事件併發送的Form界面;再由Form界面按照接收到的事件,轉發到對應的操作中;這樣Form就起到中介的作用;這就是中介模式的實際應用案例。
我們先看看定義:用一箇中介對象封裝一組對象的交互,中介者使得各對象之間不需要顯示的進行相互的引用,降低彼此之間的耦合性,而且可以獨立的改變他們之間的交互。
代碼區域:
中介者做的事情就是傳遞消息,減少同事類之間單獨的耦合;所以必須要有消息發送功能。
abstract class Mediactor
{
//定義一個抽象的發送消息方法,獲取同事對象、消息
public abstract void Send(string message,Colleague colleague);
}
同事抽象類,需要知道是哪個中介者對象在幫忙進行傳遞消息,因此需要聲明一箇中介者對象存儲;
abstract class Colleague
{
protected Mediactor mediactor;
public Colleague(Mediactor mediactor)
{
this.mediactor =mediactor;
}
}
具體的同事類,在消息發的時候,需藉助於中介者對象,將消息發送出去;
class ConcreteColleague1:Colleague
{
public ConcreteColleague1(Mediactor mediactor):base(mediactor)
{}
public void Send(string message)
{
mediactor.Send(message,this);
}
public void Notify( string message)
{
Console.WriteLine("同事1獲取的消息:"+message);
}
}
class ConcreteColleague2:Colleague
{
//將中介者對象傳入進去,應需要通過中介者對象傳遞數據
public ConcreteColleague2(Mediactor mediactor):base(mediactor)
{}
public void Send(string message)
{
mediactor.Send(message,this);
}
public void Notify( string message)
{
Console.WriteLine("同事2獲取的消息:"+message);
}
}
具體的中介者類,功能相對複雜,它需要知道所有的同事類對象、知道消息是誰傳來,是誰需要接受。
//具體的中介類需要定義所有的同事類對象並要處理他們消息相互的傳遞
class ConcreteMediactor:Mediactor
{
//需要聲明所有的同事類對象
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
public ConcreteColleague1 Colleague1
{
set{colleague1=value;}
}
public ConcreteColleague2 Colleague2
{
set{colleague2=value;}
}
public override void Send(string message,Colleague colleague)
{
//收集所有同事對象的消息並轉發到對應的同事
if(colleague==colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}
客戶端代碼:
static void Main(string[] arg)
{
ConcreteMediactor mediactor=new ConcreteMediactor();
ConcreteColleague1 colleague1=new ConcreteColleague1(mediactor);
ConcreteColleague2 colleague2=new ConcreteColleague2(mediactor);
mediactor.Colleague1=colleague1;
mediactor.Colleague2=colleague2;
colleague1.Send("借100W?");
colleague2.Send("沒有");
}