設計模式漫談之
天太熱,失眠了,實在睡不下去,就再寫篇文章來靜靜心吧,我為什麽寫設計模式,因為設計模式是思想上的東西,程序員的法寶之一就是編程思想。
在面向對象中,對象之間的認識是分角度的,比如A對象,B對象,如果A對象存了B對象的引用,那麽從A對象的角度來說,A對象認識B對象,但是B對象不認識A對象,如果B對象也存了A對象的引用,這時,才能說A,B互相認識。
或者是A,B對象互相不認識,但是A,B對象都認識C對象,而C對象認識A,B對象,這樣,可以通過C對象來間接讓A,B對象互相認識,互相通信。扮演紅娘角色,即中介角色。
對象之間的認識分區域性,比如在對象的整個生命中期都認識的對象(父母),或者是過客,我只在某個時間(時間即空間)認識的對象(某個旅遊景點認識的驢友)。
比如種種原因,兩個對象不想直接發生關系,就找一個中間人傳話。
直接上例子,我來解釋:
//抽象對象UnitedNations在方法中認識Country
abstract class UnitedNations
{
public abstract void Declare(string message, Country colleague);
}
//具體對象認識USA, Iraq 這兩個對象在方法中認識Country這個對象
class UnitedNationsSecurityCouncil : UnitedNations
{
private USA colleague1;
private Iraq colleague2;
public USA Colleague1
{
set { colleague1 = value; }
}
public Iraq Colleague2
{
set { colleague2 = value; }
}
public override void Declare(string message, Country colleague)
{
if (colleague == colleague1)
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}
//抽象對象認識UnitedNations 這個對象
abstract class Country
{
protected UnitedNations mediator;
public Country(UnitedNations mediator)
{
this.mediator = mediator;
}
}
//具體對象USA在整個生命周期中都認識mediator這個對象
class USA : Country
{
public USA(UnitedNations mediator)
: base(mediator)
{
}
public void Declare(string message)
{
mediator.Declare(message, this);
}
public void GetMessage(string message)
{
Console.WriteLine("美國獲得對方信息:" + message);
}
}
//具體對象在整個生命中期都認識mediator
class Iraq : Country
{
public Iraq(UnitedNations mediator)
: base(mediator)
{
}
public void Declare(string message)
{
mediator.Declare(message, this);
}
public void GetMessage(string message)
{
Console.WriteLine("伊拉克獲得對方信息:" + message);
}
}
/具體的中介對象
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
//c1 對象認識中介者
USA c1 = new USA(UNSC);
//c2對象也認識中介者
Iraq c2 = new Iraq(UNSC);
//中介者認識c1,c2兩個對象
UNSC.Colleague1 = c1;
UNSC.Colleague2 = c2;
//c1說話,讓中介者傳話
c1.Declare("不準研制核武器,否則要發動戰爭!");
//同樣c2發消息也是讓中介者傳話
c2.Declare("我們沒有核武器,也不怕侵略。");
總結,對象之間的認識關系分區域性,在哲學中,區域性相當於時間性,對象認識另一個對象,必須可以訪問另一個對象的空間,即另一個對象的引用。
老生常談,編程的法寶之一就是編程思想。
設計模式漫談之