在学习多线程的时候,通过学习thread,start()方法,了解到了模板模式。
在thread线程类中,我们通过new thread(),创建一个线程类。线程类通过start方法启动,然后我们自己实现run方法。这里面就用到了模板模式。
场景:
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;
控制子类的扩展。
比如thread中的run方法,他只是提供了一个主流程,具体的run里面的逻辑由我们定义的thread来实现。
也就是说,一般模板会抽象出一个主流程,子类去继承模板类,实现自己不同的细节。
下面进行简单的演示:
//定义一个模板抽象类,将需要子类自己实现的部分抽象出来为一个方法,让子类来实现
public abstract class Template{
public abstract void say();
public final void dosomething(){
say();
System.out.println("do something");
}
}
//重写模板say方法
public class TemplateSay extends Template {
@Override
public void say() {
System.out.println("say -------------");
}
}
//重写模板say方法
public class TemplateRead extends Template {
@Override
public void say() {
System.out.println("read -----------------");
}
}
public static void main(String[] args) {
Template template = new TemplateSay();
template.dosomething();
}
//进行实例化TemplateSay子类的时候,结果输出为:
say -------------
do something
public static void main(String[] args) {
Template template = new TemplateRead();
template.dosomething();
}
//进行实例化TemplateSay子类的时候,结果输出为:
read -----------------
do something
因此我们不同的实现子类就可实现不同的业务逻辑,拓展性好。去除了子类中的重复代码。子类实现算法的某些细节,有助于算法的扩展。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”
模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:
抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。