当前位置:网站首页>行为型模式-模板方法模式
行为型模式-模板方法模式
2022-08-02 09:50:00 【vbirdbest】
行为型模式
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责分配。
行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或者聚合在对象间分配行为。由于组合关系或者聚合关系比继承关系耦合度第,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。
模板方法模式
去银行办理一些业务一般都需要经过以下4个步骤:1.取号 2.排队 3.办理具体业务 4. 对工作人员评分。每个人都会按照顺序经历这4个步骤,但是每个人可能办理的业务不同。
我们可以将固定的过程放到父类中统一实现,将变化的东西放到子类中去实现。
案例
public abstract class BankService {
// 抽象方法
public abstract void handleBusiness();
// 模板方法
public final void service() {
System.out.println("1.取号");
System.out.println("2.排队");
handleBusiness();
System.out.println("4.评分");
}
}
使用模板方法模式就是把公共的代码抽取到父类中,使得子类只需要变的东西,使得子类的代码非常简洁。
public class GetMoneyBankService extends BankService {
@Override
public void handleBusiness() {
System.out.println("3.办理取钱业务");
}
}
public class PutMoneyBankService extends BankService {
@Override
public void handleBusiness() {
System.out.println("3.办理存钱业务");
}
}
public class Client {
public static void main(String[] args) {
BankService bankService = new PutMoneyBankService();
bankService.service();
bankService = new GetMoneyBankService();
bankService.service();
}
}
模板方法套路
- 模板类是抽象类,使用abstract修饰
- 模板方法使用final修饰,并实现具体的步骤。
- 抽象方法使用abstract。
- 具体类需要继承模板类并实现模板类中的抽象方法。
优缺点
优点:
- 提高代码复用性:将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。
- 实现了反向控制:通过一个父类调用子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制,并符合开闭原则。
缺点:
- 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
- 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码的阅读难度。
JDK源码解析
public abstract class InputStream implements Closeable {
// 抽象方法,子类必须重写
public abstract int read() throws IOException;
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
// 模板方法:定义了算法的框架步骤
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
// 调用当前类的抽象方法
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}
}
边栏推荐
- 【技术分享】OSPFv3基本原理
- Two-dimensional array piecemeal knowledge sorting
- 单词接龙 II
- The ggbarplot function of the R language ggpubr package visualizes the grouped histogram, sets the add parameter to mean_se to visualize the histogram of the mean values of different levels and adds
- 【New Edition】DeepFakes: Creation, Detection and Influence
- MySql tens of millions of paging optimization, fast insertion method of tens of millions of data
- STL中list实现
- qq邮箱日发5万邮件群发技术(qq邮箱怎样定时发送邮件)
- 【OpenCV】-霍夫变换
- 二维数组零碎知识梳理
猜你喜欢
牛客网项目17节生成验证码 刷新验证码一直没反应
Use the scrapy to climb to save data to mysql to prevent repetition
Re22:读论文 HetSANN An Attention-based Graph Neural Network for Heterogeneous Structural Learning
日元疲软令游戏机在日本变身“理财产品”:黄牛大赚
Shell script realizes multi-select DNS simultaneous batch resolution of domain name IP addresses (new update)
【技术分享】OSPFv3基本原理
yolov7创新点
matlab-day02
Linux system uninstall, install, upgrade, migrate clickHouse database
HikariCP database connection pool, too fast!
随机推荐
重磅大咖来袭!阿里云生命科学与智能计算峰会精彩内容剧透
AutoJs学习-存款计算器
leetcode 62. Unique Paths(独特的路径)
中国发布丨滴滴因违反网络安全法等被罚80.26亿元!调查细节公布
DVWA 通关记录 2 - 命令注入 Command Injection
Shell脚本实现多选DNS同时批量解析域名IP地址(新更新)
R语言使用zoo包中的rollapply函数以滚动的方式、窗口移动的方式将指定函数应用于时间序列、设置align参数指定结果数据中的时间标签取自窗口中的位置(参数right指定取自窗口的最右侧)
Re23:读论文 How Does NLP Benefit Legal System: A Summary of Legal Artificial Intelligence
软件测试H模型
转转反爬攻防战
第十七章 Excel操作
瑞萨RZ/G2L处理器详细测评
享年94岁,图灵奖得主、计算复杂性理论先驱Juris Hartmanis逝世
R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化堆叠的柱状图(stacked bar plot)、lab.pos参数指定柱状图的数值标签的位置,lab.col参数指定数值标
后管实现面包屑功能
用了TCP协议,就一定不会丢包嘛?
function call to print lua internal structure
The realization of the list
食品安全 | 鱼肝油不是鱼油,家有宝宝的注意了
软件测试之发现和解决bug