23种设计模式之模板模式

一.什么是模板模式

模板模式是一种行为型 **设计模式,它定义了一个算法的骨架,而将一些步骤留给子类实现。**‌这种模式允许子类在不改变算法结构的基础上,重新定义算法的某些步骤。模板模式属于行为型设计模式,主要用于处理那些需要完成一个过程,该过程包含一系列基本相同的步骤,但某些步骤可能有不同的实现的情况。

模板模式的主要特点包括:

  • 定义一个算法的骨架,将一些步骤留给子类实现。
  • 允许子类在不改变算法结构的基础上,重新定义某些步骤。
  • 适用于处理包含一系列基本相同步骤的过程,但某些步骤可能有不同的实现。

模板模式的主要角色包括:

  • 抽象类(AbstractClass):负责实现模板方法,并声明在模板方法中所使用的抽象方法。
  • 具体类(ConcreteClass):实现抽象类中的抽象方法。
  • 客户端(Client):使用具体类继承的模板方法。

二.类模式结构

实例:

定义一个抽象类AbstractDisplay其中包含模板方法display,两个实现模板的具体类,CharDisplay和StringDisplay。实现字符打印和字符串打印两种不同的打印样式。

AbstractDisplay.java

java 复制代码
package 二十三种设计模式之模板模式;
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
	open();
	for(int i=0;i<5;i++) {
		print();
	}
	close();
}
}

charDisplay.java

java 复制代码
package 二十三种设计模式之模板模式;
public class CharDisplay extends AbstractDisplay{
	private char ch;
	CharDisplay(char c){
		ch=c;
	}
public void open() {
	System.out.print("<<");
}
public void print() {
	System.out.print(ch);
}
public void close() {
	System.out.print(">>");
}
}

StringDisplay.java

java 复制代码
package 二十三种设计模式之模板模式;
public class StringDisplay extends AbstractDisplay{
	private String s;
	private int width;
	StringDisplay(String s){
		this.s=s;
		this.width=s.getBytes().length;
	}
public void open() {
	printLine();
}
public void print() {
	System.out.println("|"+s+"|");
}
public void close() {
	printLine();
}
public void printLine() {
	System.out.print("+");
	for(int i=0;i<width;i++){
		System.out.print("-");
	}
	System.out.println("+");
}
}

Test.java

java 复制代码
package 二十三种设计模式之模板模式;

public class Test {
	public static void main(String []args) {
		AbstractDisplay d1=new CharDisplay('H');
		AbstractDisplay d2=new StringDisplay("Hello,world!");
     d1.display();
     System.out.println();
     d2.display();
	}
}

输出结果:

三.模板模式的好处与注意点

好处:

注意点:

四.习题

习题3-1参考答案:

inputStream类中的方法如下

InputStream的子类如下,可以看出都继承了父类的read方法,但这些子类的不同之处在于读的方式不同。所以read需要子类去自己实现。

习题3-2参考答案:

我们都知道final修饰变量时,该变量就变成了常量,不能改变其值大小。当final修饰方法时表示该方法不能被重写。我们定义一个算法骨架,后面继承它的子类只是实现具体涉及到的方法,而不是更改股架,所以防止重写骨架,采用final修饰。

习题3-3参考答案:

将这些方法设置为protected方法。

private修饰,类内可以用。protected修饰,包内可用。public修饰,到处可用。

习题3-4参考答案:

1.接口中的方法是没有方法体的,都是抽象方法,与c++中的纯虚函数类似。

2.而AbstractClass中的模板方法是需要写算法骨架的,一定不能没有方法体。

3.抽象类中一定有抽象方法,但也可以存在非抽象方法。

相关推荐
zhangfeng11331 小时前
openclaw skills 小龙虾技能 通讯仿真 matlab skill Simulink Agentic Toolkit,通过kimi找到,mcp通讯
开发语言·matlab·openclaw·通讯仿真
Javatutouhouduan8 小时前
2026Java面试的正确打开方式!
java·高并发·java面试·java面试题·后端开发·java编程·java八股文
chao1898448 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
JAVA面经实录9178 小时前
Java初级最终完整版学习路线图
java·spring·eclipse·maven
赏金术士8 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
Cat_Rocky9 小时前
k8s-持久化存储,粗浅学习
java·学习·kubernetes
楼兰公子9 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
知识领航员10 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
吴声子夜歌10 小时前
Go——并发编程
开发语言·后端·golang
释怀°Believe10 小时前
Spring解析
java·后端·spring