Java 设计模式之模板方法
文章目录
1. 定义
- 一个算法骨架,并允许子类提供一个或者多个步骤实现、
- 模板方法使得子类在不改变算法结构的情况下,重新定义算法的某些步骤
2. 类型
行为型
3. 模板方法的适用场景
- 一次性实行算法不变的部分,并将可变的行为留给子类来实现
- 各个子类公共的部分被提取出来并集中到一个公共父类中,从而避免代码重复
4. 优点
- 提高复用性
- 提高扩展性
- 符合开闭原则
5. 缺点
- 类数目增加
- 增加了系统实现的复杂度
- 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍
6. 模板方法-扩展
- 钩子方法
7. 相关设计模式
-
模板方法和工厂方法
模板方法是工厂方法的一种特殊实现
-
模板方法和策略方法
策略模式 使不同的算法相互替换
8. coding
8.1 抽象接口
public abstract class ICourse {
protected final void makeCourse() {
this.makePPT();
this.makeVideo();
if (this.isNeedArticle()){
this.makeArticle();
}
this.packageCourse();
}
final void makePPT() {
System.out.println("制作PPT");
}
final void makeVideo() {
System.out.println("制作视频");
}
final void makeArticle() {
System.out.println("制作手记");
}
protected Boolean isNeedArticle() {
return false;
};
abstract void packageCourse();
}
8.2 抽象接口子类
public class JavaCourse extends ICourse{
@Override
void packageCourse() {
System.out.println("JAVA 课程");
}
@Override
protected Boolean isNeedArticle() {
return true;
};
}
public class JavaScriptCourse extends ICourse{
@Override
void packageCourse() {
System.out.println("javaScript 课程");
}
}
8.3 实现类
public class Test {
public static void main(String[] args) {
System.out.println("制作JAVA课程开始 start");
ICourse course = new JavaCourse();
course.makeCourse();
System.out.println("制作JAVA课程开始 end");
System.out.println("制作JAVASCROIPT课程开始 start");
ICourse javaCourse = new JavaScriptCourse();
javaCourse.makeCourse();
System.out.println("制作JAVASCROIPT课程开始 end");
}
}
模板方法起到保护作用,抽象保护的方法,已到达模板条件不一样的想过
9. 源码解析
9.1 AbstractList
abstract public E get(int index);
9.2 HttpServlet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = lStrings.getString("http.method_get_not_supported");
this.sendMethodNotAllowed(req, resp, msg);
}
9.3 BaseExecutor
protected void closeStatement(Statement statement) {
if (statement != null) {
try {
statement.close();
} catch (SQLException var3) {
}
}
}