一、前言
以前只知道抽象类与接口的区别,而不知道为什么会有这样的区别,看了模板模式的例子算是知其所以然了。
二、结构图
三、应用场景
比如说生成手机,生产的流程是相同的,但是具体的细节可能有所不同(比如手机的颜色,手机的类别,手机的大小等等)。
package TemplateDemo;
/**
* 这是一个抽象的模板类
* */
abstract class AbstractClass {
//定义一个模板方法来控制生产手机的流程
public void makeMobile(){//TemplateMethod
//首先生产手机体(模板方法自己完成)
System.out.println("生产了一个手机body");
this.makeDifferentFunction();
this.makeDifferentColor();
this.makeDifferentType();
System.out.println("一部手机制作完成");
//以上模板已经规定好了
}
//定义抽象的方法来完成不同的生产细节(不同功能的手机)
protected abstract void makeDifferentFunction();
//定义抽象的方法来完成不同的生产细节(不同颜色的手机)
protected abstract void makeDifferentColor();
//定义抽象的方法来完成不同的生产细节(不同类型的手机)
protected abstract void makeDifferentType();
}
/**
* 创建真是的实现类来实现具体的生产细节
* */
class ConcreteClass extends AbstractClass{
//实现父类中的抽象的方法
protected void makeDifferentColor() {
System.out.println("给该手机的颜色涂成蓝色");
}
protected void makeDifferentFunction() {
System.out.println("给该手机实现看MP4的功能");
}
protected void makeDifferentType() {
System.out.println("给该手机制作成翻盖的");
}
}
//写测试类
public class TestTemplate{
public static void main(String args[]){
AbstractClass ac = new ConcreteClass();//子类的对象付给父类
ac.makeMobile();//制作手机
//制作不同的手机只是修改子类就可以了
}
}