23种软件设计模式完整教程
使用场景:
模板模式通常又叫模板方法模式(Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现、适用于流程标准化的业务场景。
1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法
源码实例:
JDK:AbstractList、MyBatis:BaseExecutor等
优点:
1、封装不变部分,扩展可变部分,符合开闭原则。
2、行为由父类控制,子类实现。
缺点:
继承本身的缺点、修改父类,子类相应的全要修改。
使用实例:
实例1--课程录制类图:
实例1---课程录制代码:
package com.knowledge.system.software_design_pattern.template_pattern.course_instance;
public abstract class NetworkCourse {
protected final void createCourse(){
this.postPreResource();
this.creatPPT();
this.liveVideo();
this.postNote();
this.postScoure();
if(needHomework()){
checkHomework();
}
}
abstract void checkHomework();
//钩子方法
protected boolean needHomework(){
return false;
}
final void postPreResource(){
System.out.println("提交预习资料");
}
final void creatPPT(){
System.out.println("制作PPT");
}
final void liveVideo(){
System.out.println("录制直播视频");
}
final void postNote(){
System.out.println("提交课程笔记");
}
final void postScoure(){
System.out.println("提交源码");
}
}
package com.knowledge.system.software_design_pattern.template_pattern.course_instance;
public class JavaCourse extends NetworkCourse {
@Override
void checkHomework() {
System.out.println("检查java架构课程课件");
}
}
package com.knowledge.system.software_design_pattern.template_pattern.course_instance;
public class BigDataCourse extends NetworkCourse {
private boolean needHomeworkFlag=false;
public BigDataCourse(boolean needHomeworkFlag) {
this.needHomeworkFlag = needHomeworkFlag;
}
@Override
void checkHomework() {
System.out.println("检查大数据的课后作业");
}
@Override
protected boolean needHomework() {
return this.needHomeworkFlag;
}
}
package com.knowledge.system.software_design_pattern.template_pattern.course_instance;
import com.knowledge.system.software_design_pattern.template_pattern.course_instance.BigDataCourse;
import com.knowledge.system.software_design_pattern.template_pattern.course_instance.JavaCourse;
import com.knowledge.system.software_design_pattern.template_pattern.course_instance.NetworkCourse;
/**
* 1.模板模式:定义一个算法的骨 架,并允许子类为一个或者多个步骤提供实现。
* 1.1 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
* 1.2 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
* 2.实际例子:JDK :AbstractList、 Mybatis:BaseExecutor
*/
public class Test {
public static void main(String[] args) {
System.out.println("模板模式");
NetworkCourse javaCourse=new JavaCourse();
javaCourse.createCourse();
NetworkCourse bigDataCourse=new BigDataCourse(true);
bigDataCourse.createCourse();
}
}
实例2---游戏实例类图:

实例2---游戏实例代码:
package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
/**
* final 修饰方法,防止子类修改,父类主要定整个的流程、抽出公共不变的方法,子类实现有差异的方法。
*/
public final void play(){
initialize();
startPlay();
endPlay();
}
}
package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;
public class FootBall extends Game{
@Override
void initialize() {
System.out.println("FootBall initialize");
}
@Override
void startPlay() {
System.out.println("FootBall startPlay");
}
@Override
void endPlay() {
System.out.println("FootBall endPlay");
}
}
package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;
public class BasketBall extends Game{
@Override
void initialize() {
System.out.println("BasketBall initialize");
}
@Override
void startPlay() {
System.out.println("BasketBall startPlay");
}
@Override
void endPlay() {
System.out.println("BasketBall endPlay");
}
}
package com.knowledge.system.software_design_pattern.template_pattern.myself_instance;
public class Test {
public static void main(String[] args) {
System.out.println("模板模式测试");
Game fb=new FootBall();
fb.play();
Game gm=new BasketBall();
gm.play();
}
}