模板设计模式可以让代码得到复用
首先我们不使用模板设计模式,创建两个类,一个Student类和Teachar 类
public class Student {
/**
* 这个方法描述学生的一天
*/
public void day(){
qiChuang();
xiShu();
chiZaoCan();
doSome();
chiWanFan();
shuiJiao();
}
public void qiChuang(){
System.out.println("起床");
}
public void xiShu(){
System.out.println("洗漱");
}
public void chiZaoCan(){
System.out.println("吃早餐");
}
public void doSome(){
System.out.println("学生上学,学习");
}
public void chiWanFan(){
System.out.println("吃晚饭");
}
public void shuiJiao(){
System.out.println("睡觉");
}
}
public class Teachar {
/**
* 这个方法描述老师的一天
*/
public void day(){
qiChuang();
xiShu();
chiZaoCan();
doSome();
chiWanFan();
shuiJiao();
}
public void qiChuang(){
System.out.println("起床");
}
public void xiShu(){
System.out.println("洗漱");
}
public void chiZaoCan(){
System.out.println("吃早餐");
}
public void doSome(){
System.out.println("老师正在课堂上授课,教授学生知识");
}
public void chiWanFan(){
System.out.println("吃晚饭");
}
public void shuiJiao(){
System.out.println("睡觉");
}
}
以上是没有使用模板设计模式的Student和Teachar
存在的问题:
第一:算法没有得到重复的使用。
第二:代码没有得到复用。
以下使用模板设计模式
既然两个类里面东西都一样,除了dosome方法,我使用一个抽象类把相同的方法放在一个里面final修饰的方法里面,dosome方法用抽象方法,老师跟学习,继承抽象类,实现方法
Teacher和Student都是Person
* 1. Person就是模板方法设计模式当中的模板类。
* 2. day()方法就是模板方法设计模式当中的模板方法。
模板类通常是抽象类
模板方法添加了final之后,这个方法无法被覆盖,这样核心的算法也可以得到保护。
模板方法定义核心的算法骨架,具体的实现步骤可以延迟到子类当中去实现。
核心算法一方面是得到了保护,不能被改变。另外一方面就是算法得到了重复使用。
另外代码也得到了服用,因为算法中某些步骤的代码是固定的。
这些固定的代码不会随着子类的变化而变换,这一部分代码可以写到模板类当中。
public abstract class Person {
public final void day(){
// 第一步
qiChuang();
// 第二步
xiShu();
// 第三步
chiZaoCan();
// 第四步
doSome();
// 第五步
chiWanFan();
// 第六步
shuiJiao();
}
// 其中的某些步骤,不会随着子类的变化而变化,这些代码可以写到父类中,得到代码复用。
public void qiChuang(){
System.out.println("起床");
}
public void xiShu(){
System.out.println("洗漱");
}
public void chiZaoCan(){
System.out.println("吃早餐");
}
// 这一步是要做,但是具体这一步怎么做,子类说了算。
public abstract void doSome();
public void chiWanFan(){
System.out.println("吃晚饭");
}
public void shuiJiao(){
System.out.println("睡觉");
}
}
测试学生类和老师类
//学生类
public class Student extends Person{
@Override
public void doSome() {
System.out.println("学生在上课");
}
}
//老师类
public class Teachar extends Person{
@Override
public void doSome() {
System.out.println("老师在授课");
}
}
总测试
public class Test {
public static void main(String[] args) {
Person student = new Student();
student.day();
Person Teachar = new Teachar();
Teachar.day();
}
}