Java设计模式之模板方法模式
时间又是隔了好几天哈,今天又学习了一种设计模式,是模板方法了,这种设计模式在没有了解到之前,但是我们在开发中绝大多数都会不知不觉的用到了,不过我们并不了解我们用到的方法会是一种设计模式,哈哈哈哈,只能说伟大的思想都是共通的;下面来看一下这种设计模式的详细情况吧
一 : 什么是模板方法模式 ?
模板方法模式 : 定义一个操作中的算法骨架,将步骤延迟到子类中。
以上就是一个较为官方的描述了,实际上呢,它是将一些公共的行为,移到了一个抽象的父类中,再将那些不同的部分在父类中定义抽象实现、而将具体实现过程由子类完成,有点绕口哈,
简单的来讲,就是相同部分具体抽出,不同部分抽象抽出然后子类实现;我个人的话是这样理解的,大家有更好的描述也可以在评论写出共同理解
二: 模式实现原理
1. 模式的角色 :
AbstractTemplate(抽象类):在抽象类中定义了一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
ConcreteTemplate(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
2. 模式的结构
三: 代码实现
代码类图 :
上面的AbstractClass类中的execute方法就是一个算法骨架,它定义了复杂操作的许多步骤,其中需要注意:
(1)AbstractClass是抽象类,因为子类需要继承某些抽象方法
(2)execute是算法骨架,让外部调用,所以必须是public,但是又不想让子类进行重写,因此使用final关键字,如果重写则导致整个流程混乱。
(3)start和end方法是固定的步骤,定义为私有,不让子类修改。
(4)teaching方法是protected 的,保证子类可以重写,但是其它类无法看到,又是abstract 则子类必须重写。因为父类AbstractClass无法得知具体的物品该如何放入冰箱,只有靠子类去实现了
步骤一 : 抽象类
/**
* @version 1.0.0
* @Description 模板方法 : 课程抽象类
*/
public abstract class AbstractClass {
public final void execute(){
start();
teaching();
end();
}
private void start(){
System.out.println("开始上课");
}
private void end(){
System.out.println("下课了");
}
protected abstract void teaching();
}
步骤二 : 实现类1 : 数学课程
/**
* @version 1.0.0
* @Description 模板方法 : 课程实现类
*/
public class Math extends AbstractClass {
@Override
protected void teaching() {
System.out.println("数学老师教了 1 + 1 为什么 = 2");
}
}
实现类2 : 语文课
/**
* @version 1.0.0
* @Description 模板方法 : 课程实现类
*/
public class ChineseClass extends AbstractClass {
@Override
protected void teaching() {
System.out.println("语文老师教了我是谁");
}
}
步骤三 : 测试实现
public class ConcreteTest {
public static void main(String[] args) {
AbstractClass math = new Math();
math.execute();
System.out.println("-------------------");
AbstractClass chineseClass = new ChineseClass();
chineseClass.execute();
}
}
测试 :
开始上课
数学老师教了 1 + 1 为什么 = 2
下课了
-------------------
开始上课
语文老师教了我是谁
下课了
四 总结 :
以前的话,对于类图或者说是结构图这一块看的并不是很重,嗯,觉得这一块并不重要,主要想法是把它当做一个加深理解设计的辅助工具.没错,一个辅助的小工具,之前我就是这样看的.造成这样原因在很多的时候,我是先看到源码,之后去看类结构.这样就造成了一个先入为主.
实际上我觉得类图是非常重要的,在进行代码设计阶段,做好类结构设计的话,是非常有利于开发的.提高开发效率,高的健壮性,利于扩展等等优点,不过好在是有发现这点,在以后的代码开发中就可以多多实战了
今天对模板方法模式的学习就记录这么多,如果对大家有帮助的话,可以点一个赞哈,你的鼓励也是创作的动力.共同在计算机的世界加油吧 !