1、C#设计模式-模板方法模式
模板方法模式:提到模板我们经常会想到简历模板/PPT模板等,以简历模板为例,不同的人可以使用一样的简历模板,在填充内容时根据自己的名字/工作经历等填写自己的内容,从而形成不同的简历。在OO中模板方法模式和现实中的模板十分相似,首先要有一个封装了不可变部分的抽象类(简历的大致结构,都有姓名、性别、年龄、工作经历等),然后将可变部分延迟到子类中(不同人的简历内容不同,这些不同的内容放在子类中实现),模板方法就是多态的一种实现。抽象类中模板方法不仅仅可以定义内容的,也可以定义执行的顺序。
2、案例场景-(来自生活场景【钓鱼】)
以钓鱼为例,我们去钓鱼不管钓什么鱼都可以归结为四步:装饵料,下竿,中鱼。这三步的顺序是不变的,其中第一步是不能改变的,无论我们不管钓什么鱼都要先有饵料。我们在代码中来理解模板方法模式的用法。
定义抽象模板类:
public abstract class Gofish { public abstract void DownFood();//装饵料 public abstract void WaitFish();//等待 public abstract void UpFish();//上鱼 public void GoFishProcess() { DownFood(); WaitFish(); UpFish(); } }
然后定义子类,继续模板父类
public class FishManA : Gofish { public override void DownFood() { Console.WriteLine("钓鱼人A——上饵料"); } public override void WaitFish() { Console.WriteLine("钓鱼人A——等鱼咬钩"); } public override void UpFish() { Console.WriteLine("钓鱼人A——上鱼了"); } }
public class FishManB : Gofish { public override void DownFood() { Console.WriteLine("FishManB_上饵料"); } public override void WaitFish() { Console.WriteLine("FishManB_等鱼儿咬钩"); } public override void UpFish() { Console.WriteLine("FishManB_马上上鱼"); } }
钓鱼人A,B充当子类,分别继承重写父类的模板方法;
抽象方法定义在抽象产品类,子类AB充当具体产品类。并且实现父类的抽象方法;
调用执行:
static void Main(string[] args) { Gofish gf = new FishManA(); //gf.GoFishProcess(); FishManA fm = new FishManA(); fm.GoFishProcess(); FishManB fmb = new FishManB(); fmb.GoFishProcess(); Console.ReadKey(); }
模板方法模式的应用场景:
模板方法模式在抽象类中定义执行的方法和步骤,子类按需重写各个步骤的方法,从而满足具体的需求。某些行为可以分步执行且执行的步骤固定时可以考虑使用模板方法模式。
模板方法模式的优点:
模板方法的行为由父类控制,子类实现,提取了公共代码,便于维护。
模板方法模式的缺点:
每一种具体的实现都需要一个子类实现,可能会导致子类过多。
个人V:zp2013822 欢迎交流