模板方法模式 -- 大话设计模式
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义改算法的某些特定步骤,例如现实生活中的简历模板、论文模板等等
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势,提供了一个很好的代码复用平台。当我们遇到一些过程从高层次看是相同的,但有些步骤的实现可能不同,这时候我们就可以考虑使用模板方法模式了
1.把大象放到冰箱里与把企鹅放到冰箱里的区别
打开冰箱,大象太大了!实在放不下,切吧切吧放吧~,关冰箱门;打开冰箱,把猪塞进去,关冰箱门
定义一个抽象类,将不一样的算法定义为虚方法,让子类可以重写其方法,来定义新的特定步骤
public abstract class AnimalTemplate { protected string _name; public AnimalTemplate() { this._name = "动物"; } public void Operate() { Console.WriteLine("把{0}放到冰箱里面的过程:", this._name); this.OpenDoor(); this.Push(); this.CloseDoor(); } public void OpenDoor() { Console.WriteLine("1.打开冰箱门"); } public virtual void Push() { Console.WriteLine("2.把{0}塞进去", this._name); } public void CloseDoor() { Console.WriteLine("2.关冰箱门"); } }
定义大象和企鹅两个子类,重写push方法,各自有各自不同的放法
public class Elephant : AnimalTemplate { public Elephant() { this._name = "大象"; } public override void Push() { Console.WriteLine("2.大象太大了!实在放不下,切吧切吧放吧~"); } } public class Penguin : AnimalTemplate { public Penguin() { this._name = "企鹅"; } public override void Push() { base.Push(); } }
开启场景模拟
static void Main(string[] args) { //把大象放到冰箱里 AnimalTemplate elephant = new Elephant(); elephant.Operate(); //把企鹅放到冰箱里 AnimalTemplate penguin = new Penguin(); penguin.Operate(); }