设计模式,模板方法模式、原型模式

模板方法模式

模板方法模式,就是将一些具体层都会有重复的内容,都放在抽象层作为具体层的模板,让具体层的代码能更简洁,也更好地实现代码复用。

代码实现

若有一套试卷,有A和B两个学生来作答,其中的题目便就是A、B都不用自己去写的东西,即可以作为模板的东西。

空试卷:

/*** 模板方法模式*/
public class Paper {public void question1(String answer){System.out.println("中国的国宝动物是啥?");System.out.println(answer);}public void question2(String answer){System.out.println("海绵宝宝的住所叫什么?");System.out.println(answer);}//答题卡public void answerCard(String answer1,String answer2){this.question1(answer1);this.question2(answer2);}
}

学生作答的试卷:

public class StudentAPaper extends Paper {public void finishPaper(){this.answerCard("熊猫","菠萝屋");}
}
public class StudentBPaper extends Paper {public void finishPaper(){this.answerCard("熊猫","狼堡");}
}

业务代码:

        StudentAPaper paperA = new StudentAPaper();StudentBPaper paperB = new StudentBPaper();paperA.finishPaper();System.out.println();paperB.finishPaper();

运行结果为:

中国的国宝动物是啥?
熊猫
海绵宝宝的住所叫什么?
菠萝屋

中国的国宝动物是啥?
熊猫
海绵宝宝的住所叫什么?
狼堡

 像题目这种无需让两个学生抄题的可以复用的东西,便可以放在他们共同的父类中,此时题目就是提供给两个学生做题的模板。像这种将可以复用的代码放在抽象层,使得具体层在实现的时候能直接复用这个模板,就是使用了模板方法模式。

原型模式

让一个类实现cloneable接口并实现其clone方法,使得要复制此类的对象,只要调用其clone方法即可,这种使得对象的复制更方便的模式就是原型模式

代码实现

若学生的信息表有时要进行复制:

public class Information implements Cloneable{private String name;private String classes;private String id;//省略一些不重要代码……public Information clone(){Information paper = null;try {paper = (Information) super.clone();} catch (CloneNotSupportedException e) {e.getMessage();}return paper;}
}

当要对其类的对象进行复制,也就是要对学生信息进行复制,直接调用其clone方法即可。

但是这种只是浅复制,如果学生信息中加了一个School类型的对象,就是学校信息,调用clone方法便只会复制其地址,即新的对象和原来的对象用的是同一个School对象的信息。

要进行深复制,即新复制的对象用的School对象是一个新的对象,则要保证被引用的数据的类型也实现了cloneable接口实现了clone方法。

School类:

public class School implements Cloneable{private String name;private String address;//省略一些不重要的代码……public School clone(){School school = null;try {school = (School) super.clone();} catch (CloneNotSupportedException e) {e.getMessage();}return school;}
}

新的Information类:

public class Information implements Cloneable{private String name;private String classes;private String id;private School school;//省略一些不重要的代码……public Information clone(){Information paper = null;try {paper = (Information) super.clone();paper.school = this.school.clone();} catch (CloneNotSupportedException e) {e.getMessage();}return paper;}
}

如果要更深层次的深复制,比如School类中又有其他类型的引用类型的数据,以此类推,在clone方法中调用其对应的深层次的clone方法即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows linux服务器 以及Azure平台 密码策略配置

密码策略配置 windows 服务器Ubuntu 服务器安装libpam-pwquality密码质量检查库设置密码过期的天数密码策略限制使用过去使用过的密码 centos 7 服务器设置密码过期的天数设置最小密码长度限制使用过去使用过的密码 Azure云默认密码策略 windows 服务器 WinR或右键开始—运行—…

保持清醒!

hell,我是小索奇,今天读了几篇文章,聊一下清醒这个话题 其实生活真的需要长远的清醒,意味着我们不仅要看到眼前的快乐和挑战,还要有足够的远见和智慧去规划未来。比如你今天可繁忙,就很容易被眼前的琐事所迷…

Java工具类:对比两个集合并返回差异

在实际的软件开发过程中,经常会遇到需要对比两个集合并找出它们之间的差异的情况。为了解决这个问题,我们可以编写一个Java工具类来完成这个任务。本文将介绍如何编写这样一个工具类,并提供详细的代码解释和使用示例。 问题描述 假设我们有两…

头歌-机器学习 第12次实验 Adaboost算法

第1关:什么是集成学习 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握:1.什么是集成学习。 什么是集成学习 集成学习方法是一种常用的机器学习方法,分为b…

Vue2.x实现商城购物车

1.实现购物车页面 在页面中显示购物车中的商品信息,并能进行数量增减及商品删除操作,购物车中金额也随商品数量的变化而变化 2.创建cart.html页面 创建cart.html页面,在其中创建Vue实例,实例中首先准备一些商品信息以供显示&a…

天软特色因子看板 (2024.4 第3期)

该因子看板跟踪天软特色因子A05005(近一月单笔流出金额占比(%),该因子为近一月单笔流出金额占比(% 均值因子,用以刻画下跌时的 单成交中可能存在的抄底现象 今日为该因子跟踪第3期,跟踪其在SH000852 (中证1000) 中的表现,要点如下…

21、Lua 面向对象

Lua 面向对象 Lua 面向对象面向对象特征Lua 中面向对象一个简单实例创建对象访问属性访问成员函数完整实例 Lua 继承完整实例 函数重写 Lua 面向对象 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。 以下…

使用 IEEE (1735) Verilog 标准机制进行 IP 保护

在跑仿真的时候,如果使用第三方IP,经常会遇到第三方IP中有加密代码,有时又会遇到同样的环境既可以用VCS跑,也可以用XRUN跑,我就好奇第三方IP如何支持两个公司的加解密方式的。 以前只是知道VCS使用protect-endprotect…

【CSS】通过CSS层叠样式插入文字\content中字符串换行操作

某些页面经常需要插入文字去提醒,例如财务税票验证页面,系统老旧又不维护,提交前又不会提醒要税票验证,每次都要返工跑两趟!! 故,解决办法就是自己添加第三方的CSS样式,插入文字提醒…

微信小程序转盘抽奖

场景: 在微信小程序里面开展抽奖活动使用转盘抽奖;类似下图(图片来自百度) 方法: 使用lukcy-canvas组件 在 微信小程序 中使用 | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫…

Dolphinscheduler单机部署

目录 概述实践二进制包前置准备工作解压并启动 Dolphinscheduler登录 Dolphinscheduler启停服务配置数据库 结束 概述 Standalone仅适用于 Dolphinscheduler 的快速体验 实践 官网 官网standalone 二进制包 二进制包:在下载页面下载 Dolphinscheduler 二进制包…

Java中雪花算法的实现

背景 在id生成器中,我们自己手写一个自增的id生成器很简单,也很好用。但这只是单机中的id生成器,当我们在集群中使用时,一个集群就会有一个id生成器实例,就意味着每一个集群的id都会从0开始,最后就会导致i…

IO流【 文件字符输入、出流;带缓冲区的字符输入、出流;对象流】

day36 IO流 字符流继承图 字符流 继day35 应用场景:操作纯文本数据 注意:字符流 字节流编译器 编译器:可以识别中文字符和非中文字符,非中文字符获取1个字节(一个字节一个字符),编译器会根据…

深入浅出Golang image库:编写高效的图像处理代码

深入浅出Golang image库:编写高效的图像处理代码 引言image库概览图像处理基础概念image库的主要组成和功能image接口图像格式的支持color模型 结论 图像的基本操作创建图像新图像的创建从文件加载图像 图像的保存与导出图像的颜色和像素处理绘制基本形状和文字 高级…

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区:开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区:开源数据库官方网站官方介绍贡献攻略开源技术…

数据结构(三)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

使用Python实现K均值聚类算法

K均值(K-Means)算法是一种常用的聚类算法,它将数据集分成K个簇,每个簇的中心点代表该簇的质心,使得每个样本点到所属簇的质心的距离最小化。在本文中,我们将使用Python来实现一个基本的K均值聚类算法&#…

关于ABP 新增表,dbfirst模式

下面的代码是基于abp生成的项目,项目名:Store 1.在Domain结尾的项目中通过EF工具生成数据实体: Scaffold-DbContext Data Source服务器IP;Initial Catalog数据库;User Idsa;Password密码;EncryptFalse; Microsoft.EntityFrameworkCore.SqlS…

JVM常量池

JVM中的常量池主要有以下几个类别,它们各自在JVM中的位置随着JDK版本的演进而有所变化: Class文件常量池: 位置:存在于每个独立的.class文件中。这是编译期间生成的二进制文件的一部分,它包含了该类或接口的所有编译期…

Java基础_15集合及其方法

今天的内容 1.集合 1.集合【重点】 1.1为什么使用集合 集合和数组是一样的都是用来存储数据的!!! 真实的开发的时候,使用的是集合不是数组,为啥? 数组存数据: ​ 1.数组的容量是固定的 ​ 2.数组封装的方法…