23种设计模式之模板模式

server/2024/10/21 5:37:41/

一.什么是模板模式

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

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

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

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

  • 抽象类(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.抽象类中一定有抽象方法,但也可以存在非抽象方法。


http://www.ppmy.cn/server/110325.html

相关文章

docker技术详解,带你全方面玩懂docker

目录 一、docker简介 1.1 什么是docker 1.2 docker与虚拟化的对比 1.3 docker的优势 二、部署docker 2.1 容器的工作方法 2.2 部署docker 2.2.1 配置docker的软件仓库 三、docker的基本操作 3.1 docker的镜像管理 3.1.1 拉取镜像&#xff1a; 3.1.2 搜索镜像&#…

【#第三期实战营闯关作业 ##Lagent 自定义你的 Agent 智能体】

这几天学习了樊奇老师讲授的《Lagent 自定义你的 Agent 智能体》一课&#xff0c;受益颇深&#xff0c;非常感谢书生浦语团队老师们提供的如此丰盛的大餐&#xff0c;真得很香&#xff01;下面是实操的截图&#xff1a; 为 Lagent 创建环境 conda create -n agent_camp3 pytho…

望繁信科技亮相2024数博会:以流程智能引领数字化转型新未来

在全球瞩目的2024中国国际大数据产业博览会&#xff08;以下简称“数博会”&#xff09;上&#xff0c;上海望繁信科技有限公司&#xff08;简称“望繁信科技”&#xff09;作为大数据流程智能领域的领军企业&#xff0c;隆重亮相并展示了其在数字化转型与人工智能领域的最新科…

谷粒商城实战笔记-275~276-商城业务-订单服务-订单确认页完成

文章目录 一&#xff0c;275-商城业务-订单服务-订单确认页完成1&#xff0c;防止订单重复提交 二&#xff0c;276-商城业务-订单服务-原子验令牌Lua 脚本Java 代码 包括内容&#xff1a; 275-商城业务-订单服务-订单确认页完成276-商城业务-订单服务-原子验令牌 一&#xff…

题解AtCoder ABC 358 F Easiest Maze

一道模拟题。 思路 最短的路线是直接竖着走下来&#xff0c;经过 n n n 个格子&#xff0c;所以 k k k 最小是 n n n。如果想要延长路线&#xff0c;可以采用九转大肠的形状&#xff0c;就像这样&#xff1a; 可以发现&#xff0c;每次向左走之后都必须走回来&#xff0c;…

sqlite3的db.parallelize方法:并行执行SQL语句,提升数据库操作效率

在Node.js环境中&#xff0c;sqlite3作为一个广受欢迎的轻量级数据库库&#xff0c;为开发者提供了一个与SQLite数据库进行交互的简洁API。在进行数据库操作时&#xff0c;为了提高效率&#xff0c;sqlite3提供了db.parallelize方法&#xff0c;允许并行执行多个SQL语句&#x…

977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 &#xff1a; class Solution {public int[] sortedSquares(int[] nums) {// 找到绝对值最小的数下标int minIdx -1;int min Integer.MAX_…

从小鹏看自动驾驶发展趋势

 小鹏&#xff1a;端到端大模型量产落地&#xff0c;体验升级成下阶段主线 算法端&#xff0c;小鹏已量产国内首个端到端大模型&#xff0c;其模型采用分段式结构&#xff0c;分为神经网络 XNet、规控大模型 XPlanner 以及大语言模型 XBrain 三部分。数据闭环方面&#xff0…