文章目錄
- 實現的過程是先定義蝌蚪,青蛙都是一種動物類型。
- 然後遊泳行為和呼吸行為也抽象為對象(在這裡沒有定義成介面)
- 上帝類型負責造物以及進化的過程
在物件導向的理論中,始終強調是抽象與組合以及一些其他物件導向的機制比如繼承,封裝和多態。
前面的文章都將有抽象是什麼,至於抽象如何使用,就是把實現往上總結共性而去除特性,由此得到抽象層次和實現層次,所以設計模式中的基本上很多都是利用這種方法來實現物件導向的抽象,以使得軟體能夠降低變化帶來的影響。
我們知道C#是一種強型別的語言,也就是對象的行為在定義的時候就確定好了,如果要使用另外的行為,要麼使用靜態定義時期的繼承機制,另外一種方法就是組合(是一種動態機制,可以在程式運行期間給對象加上行為,這就是造就個體的差異,這種和我們的發展觀是符合的。實際上在設計的過程中就是一動一靜相互平衡和諧。)
接下來講的是在動態時期給對象執行個體加上行為。
故事是一隻動物也就是上帝創造的一隻蝌蚪,或許生下來就能遊泳,然後經曆一段時間的進化慢慢長成了青蛙,青蛙王子就能呼吸了。
在Javascript動態弱類型的實現動態給對象執行個體加上行為是沒有難度的,可是給一個對象執行個體加上行為在C#這種靜態類型機制中,實現是有難度的,不過現在的C#支援動態屬性這種方法。
在設計模式中也有一種裝飾(decorator)模式,意圖是給對象增加行為。
實現的過程是先定義蝌蚪,青蛙都是一種動物類型。
namespace DecoratorPattern
{
abstract class Animal
{
public abstract void Run();
}
}
namespace DecoratorPattern
{
class Tadpole :Animal
{
private Animal animal;
public Tadpole(Animal animal)
{
this.animal = animal;
}
public override void Run()
{
Console.WriteLine("我是一隻蝌蚪");
}
}
}
namespace DecoratorPattern
{
class Frog:Animal
{
private Animal animal;
public Frog(Animal animal)
{
this.animal = animal;
}
public override void Run()
{
Console.WriteLine("我是一隻青蛙");
}
}
}
然後遊泳行為和呼吸行為也抽象為對象(在這裡沒有定義成介面)
namespace DecoratorPattern
{
class Swimable : Animal
{
private Animal animal;
public Swimable(Animal animal)
{
this.animal = animal;
}
public override void Run()
{
animal.Run();
Console.WriteLine("我是能遊泳的");
}
}
}
namespace DecoratorPattern
{
class Breathable : Animal
{
private Animal animal;
public Breathable(Animal animal)
{
this.animal = animal;
}
public override void Run()
{
animal.Run();
Console.WriteLine("我上岸了,我能呼吸啦.");
}
}
}
上帝類型負責造物以及進化的過程
這樣用戶端看不出後台發生了什麼變化,使用靜態原廠模式隱藏建立和進化的過程。這樣我們的用戶端代碼才會看起來優美流暢(哈哈順便把My Code也包括了)。
namespace DecoratorPattern
{
class God
{
public static Tadpole CreateKedou()
{
return new Tadpole(null);
}
internal static Swimable FirstJinhua(Animal single)
{
Swimable swimable = new Swimable(new Tadpole(single));
return swimable;
}
internal static Breathable SecondJinhua(Animal single)
{
Breathable breathable = new Breathable(new Frog(single));
return breathable;
}
}
}
具體的源碼見附件。TagpoleBecomesFrog