1. 程式人生 > >C# - 設計模式 - 模板模式

C# - 設計模式 - 模板模式

共同點 light 完成 兩個 .html www class override ria

模板模式

問題場景

咖啡和茶派生於抽象類飲料,咖啡和茶都具有燒水的方法,所以可以將燒水的方法提取到抽象類飲料中去實現,而咖啡具有一個向杯子加咖啡粉的方法,茶具有一個向杯子加茶葉的方法,看起來兩個方法是不同的邏輯,而抽象類在很多地方都被其它類型所引用,也即其它類型都會調用抽象類而非其子類,以便解耦依賴。所以,我們應該盡量將看起來不一樣但有共同點的行為提取到抽象類中定義成抽象成員,抽象成員就像模板,模板總是靠子類幫抽象類去填充實現,這樣,在運行時,調用抽象實例就可以得到這些具體的實現了。

總結模式

將看起來具有不同邏輯但具有相同行為模式的成員泛化、提取到抽象類中定義為抽象成員,這樣就統一了算法的命名,具體實現則交給各個子類去完成,從而使對抽象的引用變得更合理,使解耦和調用變得更具有可能性。

示例代碼

public class Coffe
{
//燒水
public void BoilWater( ) { }

//沖泡咖啡
public void BrewingCoffe( ) { }

//倒入水杯
public void InCup( ) { }

//加牛奶
public void MilkInCup( ) { }
}

public class Tea
{
//燒水
public void BoilWater( ) { }

//沖泡茶葉
public void BrewingTea( ) { }

//倒入水杯

public void InCup( ) { }

//加檸檬
public void LemoInCup( ) { }
}

兩個類中,都有燒水和倒入水杯的方法,應提取到抽象類中定義成實例方法

public class Drink
{
//燒水
public void BoilWater( ) { }

//倒入水杯
public void InCup( ) { }
}

兩個類中,沖泡的對象和附加的材料雖然不一樣,但可以找到它們的共同點,那就是沖泡和附加材料,雖然具體實現的細節不一樣,但還是可以將它們泛化為兩個相同的行為。

public abstract class Drink
{
//燒水
public void BoilWater( ) { }
//倒入水杯
public void InCup( ) { }
//沖泡,抽象
public abstract void Brewing( );
//加材料,抽象
public abstract void XxInCup( );
}

public class Coffe : Drink
{
public override void Brewing( ) { }
public override void XxInCup( ) { }
}

public class Tea : Drink
{
public override void Brewing( ) { }
public override void XxInCup( ) { }
}

  

C# - 設計模式目錄

C# - 設計模式 - 模板模式