Template
模板方法模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
说人话就是:如果一件事情按照固定的步骤、固定的顺序去完成,但是步骤又可以有不同的实现,那么可以提取相同的逻辑,不同的逻辑交由子类实现。这就可以使用模板方法模式。再换句话说就是抽象父类定义好执行逻辑(模板方法),子类实现各自的算法逻辑。然后再调用模板方法按照一定的顺序完成逻辑执行。

- templateMethod:模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
- abstractMethod:抽象方法,交由子类具体实现
- concreteMethod:具体方法,在父类中已经实现
- hookMethod:钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
1、场景描述
驾照的考试顺序为:科一、科二、科三、科四。我们定义科一和科四都是统一的机考,对于科二、科三来说,各个地方有不同的考试规则以及各个科目的考试顺序也不同。下面使用模板方法模式来实现。2、实现
```csharp ////// 驾考抽象模板类 /// public abstract class AbstractDrivingExamine { ////// 控制具体的考试顺序 /// 每前一科过了才能继续考试下一科 /// public void Exam() {
} ///bool res1 = Subject1();bool res2 = false;if (res1)res2 = Subject2();bool res3 = false;if (res2)res3 = Subject3();if (res3)Subject4();
/// 科一是固定的,在父类实现 /// public bool Subject1() {
} ///Console.WriteLine("科一考试..."); return true;/// 科二不固定,交由子类具体实现 /// public abstract bool Subject2(); ////// 科三不固定,交由子类具体实现 /// public abstract bool Subject3(); ////// 科四是固定的,在父类实现 /// public bool Subject4() {
} } ///Console.WriteLine("科四考试..."); return true;/// 清远驾考 /// public class QingYuanDrivingExamine : AbstractDrivingExamine { public override bool Subject2() {
} public override bool Subject3() {Console.WriteLine("考试科二:倒车入库、直角转弯、侧方停车、S弯、定点停车与起步"); return true;
} } ///Console.WriteLine("考试科三:起步、靠边停车、变道、超车......直线行驶"); return true;/// 深圳驾考 /// public class ShenZhenDrivingExamine : AbstractDrivingExamine { public override bool Subject2() {
} public override bool Subject3() {Console.WriteLine("考试科二:倒车入库、侧方停车、S弯、直角转弯、定点停车与起步"); return true;
} }Console.WriteLine("考试科三:起步、超车、变道、直线行驶......靠边停车"); return true;
// 客户端调用 AbstractDrivingExamine shenZhen = new ShenZhenDrivingExamine(); shenZhen.Exam(); Console.WriteLine(“*“); AbstractDrivingExamine qingYuan = new QingYuanDrivingExamine(); qingYuan.Exam(); ``` 祝所有驾考伙伴全部一杆过!!!太TM难受了。
3、优缺点
优点:
- 封装相同逻辑,交由子类实现可变部分,便于扩展,代码复用
- 符合开闭原则
缺点:
