该文章是阅读《图解设计模式》的学习笔记。书本链接https://www.ituring.com.cn/book/1811
模板的本意是指带有镂空文字的薄塑料板,可以用笔在模板的镂空处进行临摹,即可写出和镂空处一样的工整文字。通过镂空处直接可以看到能够临摹出来的文字有哪些,但如果使用不同的笔进行临摹,临摹出来的文字颜色有可能是不一样的。编写程序时,也可以使用这种思维,在父类中定义处理流程的框架,在子类中实现具体处理。而这种模式就称为Template Method模式。下面来看该模式的结构图:
下面看一下每个类的具体代码:
CopyingBoard抽象类代码:
public abstract class CopyingBoard {
public abstract void pickUpAPen();
public abstract void copying();
public abstract void putDownAPen();
public final void operate(){//声明为final,表示在子类中无法重写该方法,因此如果要继承该抽象类则无法修改该方法
pickUpAPen();
copying();
putDownAPen();
}
}
Pencil类代码:
public class Pencil extends CopyingBoard {
@Override
public void pickUpAPen() {
System.out.println("拿起了铅笔");
}
@Override
public void copying() {
System.out.println("使用铅笔进行临摹");
}
@Override
public void putDownAPen() {
System.out.println("放下了铅笔");
}
}
RedPen类代码:
public class RedPen extends CopyingBoard {
String color;
String name;
public RedPen(String color ,String name) {
this.color = color;
this.name = name;
}
@Override
public void pickUpAPen() {
printLine();
System.out.println("拿起了"+color+"色的"+name);
}
@Override
public void copying() {
System.out.println("使用"+color+"色的"+name+"进行临摹");
}
@Override
public void putDownAPen() {
System.out.println("放下了"+color+"色的"+name);
printLine();
}
public void printLine(){
System.out.println("--------分隔线---------");
}
}
People入口类代码:
public class People {
public static void main(String[] args) {
CopyingBoard pencil = new Pencil();
CopyingBoard redPen = new RedPen("红","钢笔");
CopyingBoard bluePen = new RedPen("蓝","钢笔");
pencil.operate();
redPen.operate();
bluePen.operate();
}
}
通过观察上面的代码可以发现,使用了该模式后,在父类的模板方法operate中编写了算法之后,无需在每个子类中再编写算法。如果不使用该模式来实现,而是使用复制粘贴直接编写多个类似的类,假如最后才发现operate函数的算法逻辑有错误,那么就要全部重新改,而使用了该模式则没有这种问题。接着分析一下该模式对父类和子类之间有什么要求,
父类对子类的要求:
1.在子类中可以调用父类的方法
2.可以在子类中重写父类的方法改变程序的行为
3.可以在子类中增加父类之外的方法实现新功能
子类对父类的要求:
1.期待并要求子类去实现抽象方法
分析该模式中出现的角色:
1.AbstractClass(抽象类):即上面代码中的CopyingBoard类,该类负责实现模板方法(如上面的operate方法),并负责声明在模板方法中所使用的到的抽象方法(如上面的pickUpAPen、copying、putDownAPen方法)。
2.ConcreteClass(具体类):即上面代码中的Pencil和RedPen类,负责实现抽象类中定义的抽象方法(如上面的pickUpAPen、copying、putDownAPen方法),这些实现的方法会在抽象类的模板方法中调用。除此之类,还可以在具体类中增加父类之外的方法实现新功能。