// 客户端调用 class Client { static void Main( string [] args) { // 创建一个菠菜实例并调用模板方法 Spinach spinach = new Spinach(); spinach.CookVegetabel(); Console.Read(); } } public abstract class Vegetabel { // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序 public void CookVegetabel() { Console.WriteLine( "抄蔬菜的一般做法" ); this .pourOil(); this .HeatOil(); this .pourVegetable(); this .stir_fry(); } // 第一步倒油 public void pourOil() { Console.WriteLine( "倒油" ); } // 把油烧热 public void HeatOil() { Console.WriteLine( "把油烧热" ); } // 油热了之后倒蔬菜下去,具体哪种蔬菜由子类决定 public abstract void pourVegetable(); // 开发翻炒蔬菜 public void stir_fry() { Console.WriteLine( "翻炒" ); } } // 菠菜 public class Spinach : Vegetabel { public override void pourVegetable() { Console.WriteLine( "倒菠菜进锅中" ); } } // 大白菜 public class ChineseCabbage : Vegetabel { public override void pourVegetable() { Console.WriteLine( "倒大白菜进锅中" ); } } |
抽象模板角色(Vegetable扮演这个角色):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。
具体模板角色(ChineseCabbage和Spinach扮演这个角色):实现父类所定义的一个或多个抽象方法。
实现了代码复用
能够灵活应对子步骤的变化,符合开放-封闭原则