模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
abstract class AbstractClass {
// 一些抽象行为,放到子类去实现
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类实现
public void TemplateMethod() {
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
class ConcreteClassA : AbstractClass {
public override void PrimitiveOperation1() {
Console.WriteLine("具体类A方法1实现");
}
public override void PrimitiveOperation2() {
Console.WriteLine("具体类A方法2实现");
}
}
class ConcreteClassB : AbstractClass {
public override void PrimitiveOperation1() {
Console.WriteLine("具体类B方法1实现");
}
public override void PrimitiveOperation2() {
Console.WriteLine("具体类B方法2实现");
}
}
客户端调用
static void Main(string[] args) {
AbstractClass c;
c = new COncreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
Console.Read();
}
来个Java的冲饮料的例子来具体看下
模板类
/**
* @Author: yaoyanmeia
* @Date: 2019/6/5 11:00
* 冲饮料(拿出去卖钱了)
*/
public abstract class Bevegrage {
// 不能被重写
public final void create() {
// 1、把水烧开
boilWater();
// 2、把杯子准备好、原材料放到杯子中
pourInCup();
// 3、用水冲泡
brew();
// 4、加辅料
addCoundiments();
}
public abstract void pourInCup();
public void boilWater(){
System.out.println("烧开水,烧到100度可以起锅了");
}
public void brew() {
System.out.println("将开水倒入杯中进行冲泡");
}
public abstract void addCoundiments();
}
冲咖啡
public class Coffee extends Bevegrage{
public void pourInCup() {
System.out.println("将咖啡倒入杯中");
}
public void addCoundiments() {
System.out.println("添加牛奶和糖");
}
}
冲茶
public class Tea extends Bevegrage{
public void pourInCup() {
System.out.println("将茶叶放入杯中");
}
public void addCoundiments() {
System.out.println("添加蜂蜜");
}
}
客户端调用
public class TestTemplate {
public static void main(String[] args){
Coffee coffee = new Coffee();
coffee.create();
}
// SpringJDBC用的是模板模式
// 是java规范,各个数据库厂商自己去实现
// 1、 加载驱动类DriverManager
// 2、 建立连接
// 3、 创建语句集(标准语句集、预处理语句集) (语句集不确定MySql、Oracle、SqlServer、Access)
// 4、 执行语句集
// 5、 结果集ResultSet 游标
// 6、 ORM
}
运行效果
烧开水,烧到100度可以起锅了
将咖啡倒入杯中
将开水倒入杯中进行冲泡
添加牛奶和糖
模板方法模式通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势。提供了一个很好的代码复用平台。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,这时候,我们就可以考虑使用模板方法模式。通过末班方法模式把不变的行为搬移到单一的地方,帮助子类拜托重复的不变形为的纠缠。如Spring的JDBC。