比较详细的资料:
https://www.cnblogs.com/jenkinschan/p/5768760.html
https://blog.youkuaiyun.com/kongzhongniao/article/details/80497565
一、定义:定义一个操作中的算法的框架,而将这些步骤的实现延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 其中它的方法分为两类:1、基本方法。2、模板方法(模板方法是对基本方法的调用,有一定的逻辑,一般加上final关键词)。
二、通用UML图:
三、通用代码:
package 模板模式通用;
//抽象类
public abstract class AbstractClass {
public abstract void doSomthing();
public abstract void doAnything();
public void templateMethod() { //模板模式的这个方法都这样么???
this.doSomthing();
this.doAnything();
}
}
//具体子类1
public class ConcreteClass1 extends AbstractClass {
@Override
public void doSomthing() {
System.out.println("1号子类做了一些事");
}
@Override
public void doAnything() {
System.out.println("1号子类做任何一件事");
}
}
//具体子类2
public class ConcreteClass2 extends AbstractClass {
@Override
public void doSomthing() {
System.out.println("2号子类做了一些事");
}
@Override
public void doAnything() {
System.out.println("2号子类做任何一件事");
}
}
//情景类
public class Client {
public static void main(String args[]) {
AbstractClass a1=new ConcreteClass1();
AbstractClass a2=new ConcreteClass2();
a1.templateMethod();
System.out.println();
a2.templateMethod();
}
}
示例:
几乎所有的应用系统,都需要系统登录控制的功能,有些系统甚至有多个登陆控制的功能。
以一个基于Web的企业级应用系统为例,有管理员和普通员工两种方式。
思考:
两部分分别实现就不说了,“不好想到”。然后考虑两种登陆方式大同小异,所以可以抽象出相同的地方,即登陆流程可以做成一个模板类。。。
示例2:
咖啡与茶的冲泡。
抽象模板类:
package 冲咖啡;
public abstract class AbstractDrink {
public void water() {
System.out.println("把水煮沸");
}
public abstract void flush();
public abstract void put();
public abstract void addSugar();
public void start() {
this.water();
this.flush();
this.put();
this.addSugar();
}
}
冲茶具体实现类:
package 冲咖啡;
public class Tea extends AbstractDrink {
@Override
public void flush() {
System.out.println("用沸水冲泡茶叶");
}
@Override
public void put() {
System.out.println("把茶倒进杯子");
}
@Override
public void addSugar() {
System.out.println("加柠檬");
}
}
冲咖啡具体实现类:
package 冲咖啡;
public class Coffe extends AbstractDrink {
@Override
public void flush() {
System.out.println("用沸水冲泡咖啡");
}
@Override
public void put() {
System.out.println("把咖啡倒进杯子");
}
@Override
public void addSugar() {
System.out.println("加糖和牛奶");
}
}
场景类:
public class Client {
public static void main(String[] args) {
AbstractDrink ad=new Coffe();
AbstractDrink ad2=new Tea();
ad.start();
System.out.println();
ad2.start();
}
}
感想:
模板类本身概念挺简单,也经常不知不觉的使用,注意的是模板模式体现了好莱坞原则。
PS:注意好莱坞法则、控制倒转(IOC)、反射、依赖注入的关系。。。
The end;