【设计模式】JAVA Design Patterns——Private Class Data(私有类数据设计模式)

🔍目的


私有类数据设计模式试图通过限制属性的可见性来减少属性的暴露。 通过将它们封装在单个Data对象中,可以减少类属性的数量。

🔍解释


真实世界例子

想象一下你在为家人做晚餐炖汤。你想阻止家庭成员在你烹饪时偷偷品尝菜品,否则后面可能东西不够吃了。

通俗的说

私有类数据模式通过将数据与使用它的方法分离到维护数据状态的类中,从而防止了对不可变数据的操纵。

维基百科

私有类数据是计算机编程中的一种设计模式,用于封装类属性及其操作

程序示例

根据上面炖汤的例子。 首先我们有 炖汤类 ,它的属性没有被私有类数据保护,从而使炖菜的成分对类方法易变。

public class Stew {private static final Logger LOGGER = LoggerFactory.getLogger(Stew.class);private int numPotatoes;private int numCarrots;private int numMeat;private int numPeppers;public Stew(int numPotatoes, int numCarrots, int numMeat, int numPeppers) {this.numPotatoes = numPotatoes;this.numCarrots = numCarrots;this.numMeat = numMeat;this.numPeppers = numPeppers;}public void mix() {LOGGER.info("Mixing the stew we find: {} potatoes, {} carrots, {} meat and {} peppers",numPotatoes, numCarrots, numMeat, numPeppers);}public void taste() {LOGGER.info("Tasting the stew");if (numPotatoes > 0) {numPotatoes--;}if (numCarrots > 0) {numCarrots--;}if (numMeat > 0) {numMeat--;}if (numPeppers > 0) {numPeppers--;}}
}

 现在,我们有了 ImmutableStew类,其中的数据受StewData类保护。 现在,其中的方法无法处理ImmutableStew类的数据。

public class StewData {private final int numPotatoes;private final int numCarrots;private final int numMeat;private final int numPeppers;public StewData(int numPotatoes, int numCarrots, int numMeat, int numPeppers) {this.numPotatoes = numPotatoes;this.numCarrots = numCarrots;this.numMeat = numMeat;this.numPeppers = numPeppers;}public int getNumPotatoes() {return numPotatoes;}public int getNumCarrots() {return numCarrots;}public int getNumMeat() {return numMeat;}public int getNumPeppers() {return numPeppers;}
}
public class ImmutableStew {private static final Logger LOGGER = LoggerFactory.getLogger(ImmutableStew.class);private final StewData data;public ImmutableStew(int numPotatoes, int numCarrots, int numMeat, int numPeppers) {data = new StewData(numPotatoes, numCarrots, numMeat, numPeppers);}public void mix() {LOGGER.info("Mixing the immutable stew we find: {} potatoes, {} carrots, {} meat and {} peppers",data.getNumPotatoes(), data.getNumCarrots(), data.getNumMeat(), data.getNumPeppers());}
}

 创建每个类并调用其方法

var stew = new Stew(1, 2, 3, 4);
stew.mix();   // Mixing the stew we find: 1 potatoes, 2 carrots, 3 meat and 4 peppers
stew.taste(); // Tasting the stew
stew.mix();   // Mixing the stew we find: 0 potatoes, 1 carrots, 2 meat and 3 peppers
var immutableStew = new ImmutableStew(2, 4, 3, 6);
immutableStew.mix();  // Mixing the immutable stew we find: 2 potatoes, 4 carrots, 3 meat and 6 peppers

🔍类图

Private Class Data 

🔍适用性

在以下情况下使用私有类数据模式

  • 您要阻止对类数据成员的写访问。

🔍Ending


Private Class Data模式(私有类数据模式)是一种软件设计模式,旨在通过封装类的初始化数据、控制对类属性的更改,并保持类数据与使用这些数据的方法间的隔离,来减少类对外暴露的属性。


希望本文能够帮助读者更深入地理解私有类数据设计模式,在实际项目中发挥其优势。谢谢阅读!


希望这份博客草稿能够帮助到你。如果有其他需要修改或添加的地方,请随时告诉我。

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

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

相关文章

C#WPF数字大屏项目实战08--生产量/良品统计

1、区域划分 生产量/良品统计这部分位于第二列的第二行 2、livechart拆线图 定义折线图,如下: <lvc:CartesianChart> <lvc:CartesianChart.Series> <!--设置Series的类型为 Line 类型, 该类型提供了一些折线图的实现--> <lvc:LineSeries/>…

什么是Vector Database(向量数据库)?

什么是Vector Database(向量数据库)&#xff1f; 向量数据库是向量嵌入的有组织的集合&#xff0c;可以随时创建、读取、更新和删除。向量嵌入将文本或图像等数据块表示为数值。 文章目录 什么是Vector Database(向量数据库)&#xff1f;什么是嵌入模型(Embedding Model)&…

idea 常用插件推荐

文章目录 1、Lombok2、Convert YAML and Properties File3、Grep Console4、MyBatisX5、Free MyBatis Tool6、MyBatis Log EasyPlus &#xff08;SQL拼接&#xff09;7、MyBatisPlus8、Eclipse theme9、Eclipse Plus Theme10、Rainbow Brackets Lite - Free and OpenSource&…

操作系统教材第6版——个人笔记3

2.1 处理器 2.1.1 处理器与寄存器 处理器部件的简单示意 用户程序可见寄存器 可以使程序员减少访问主存储器的次数&#xff0c;提高指令执行的效率所有程序可使用&#xff0c;包括应用程序和系统程序数据寄存器&#xff1a;又称通用寄存器地址寄存器&#xff1a;索引、栈指针…

review of c++

友元关系是单向的。 指针

为什么要做与运算?网关如何和ip做与运算?

在计算机网络中&#xff0c;“与运算”是一个基本而重要的概念&#xff0c;尤其在IP地址和子网掩码的处理中起着关键作用。本文将解释为什么要进行与运算&#xff0c;以及网关如何和IP地址进行与运算。 为什么要做与运算&#xff1f; 1. 确定网络地址 与运算&#xff08;AND…

Linux学习笔记9

Linux 进程间通信 介绍一下管道&#xff0c;管道是一种特殊的文件&#xff0c;它通过文件描述符来进行访问和操作 管道的读写操作是阻塞式的&#xff0c;如果没有数据可读&#xff0c;读操作会被阻塞&#xff0c;直到有数据可读&#xff1b;如果管道已满&#xff0c;写操作也…

CodeArts 6月体验官活动重磅来袭,限量领取华为GT系列手表!

千呼万唤始出来&#xff0c;CodeArts 6月体验官活动来啦&#xff01; 为了让开发者更好地体验CodeArts&#xff0c;小编特意给大家准备了重磅好礼。 不仅有华为GT系列手表&#xff0c;还有开发者定制礼盒&#xff0c;更有多重定制好礼~ 快叫上小伙伴一起来体验CodeArts&…

2024年湖北职称评审面试答辩技巧有哪些?看完你就懂了

2024年度湖北省部分工程专业水平能力测试面试答辩开始了&#xff0c;答辩时间是&#xff1a;2024年6月15、16日。 测试地点&#xff1a;武汉市武昌区洪山侧路63号茶港军转小区1号楼(武汉大学西门旁) 水平能力测试注意事项&#xff1a; &#xff08;一&#xff09;报名参加202…

数据结构之归并排序算法【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

Kolmogorov–Arnold Networks (KAN) 即将改变 AI 世界

目录 一、说明 二、KAN介绍 2.1 什么是 Kolmogorov-Arnold Networks &#xff08;KAN&#xff09;&#xff1a; 2.2 KAN 的秘诀&#xff0c;Splines&#xff01; 2.3 了解KAN工作的最简单方法 三、KAN的主要优点 四、KAN 的 Python 实现 &#xff08;PyKAN&#xff09; 4.1 …

可燃气体报警器效检:预防事故,守护家园

在现代化工业生产、居民生活中&#xff0c;可燃气体报警器作为安全预防的重要工具&#xff0c;其准确性和可靠性直接关系到人们的生命财产安全。 因此&#xff0c;对可燃气体报警器进行定期效检&#xff0c;确保其处于最佳工作状态&#xff0c;是保障安全生产的必要措施。 接…

Java集合之List(超详细)

List是Java集合框架中一个非常重要的接口&#xff0c;它代表了一个有序的集合&#xff0c;允许元素重复&#xff0c;并且可以按照插入的顺序进行访问。 我们先来看看List在集合中的位置&#xff1a; List是单列集合接口Collection下的一个分支&#xff0c;另两个分支是Set和Qu…

【Redis数据库百万字详解】数据类型

文章目录 一、字符串类型概述1.1、数据类型1.2、字符串简介1.3、字符串应用场景 二、字符串命令三、哈希类型概述3.1、哈希介绍3.2、哈希类型应用场景3.3、哈希命令 四、列表类型概述4.1、列表简介4.2、使用场景4.3、列表命令 五、集合概述5.1、集合简介5.2、使用场景5.3、集合…

网络工程从头做-1

网络工程从头做-1 自下而上&#xff0c;从接入交换机开始网络的配置和规划 实验拓扑&#xff1a; 实验步骤&#xff1a; 1.完成基本配置 1.1 PC端IP地址信息配置略 1.2 接入层交换机S1配置 [Huawei]sys S1 [S1]undo in [S1]vlan b 10 20 [S1]int e0/0/1 [S1-Ethernet0/0/1]p l…

k8s怎么监听自定义资源的变更?(2)

接上一篇当生成下面代码之后怎么去使用呢&#xff1f; 1.生成crd文件 这里我们通过kubebuilder的一个子项目 controller-gen 来生成crd文件 https://github.com/kubernetes-sigs/controller-tools curl -L -o https://github.com/kubernetes-sigs/controller-tools; go ins…

D-Day 上海站回顾丨以科技赋能量化机构业务

5月31日下午&#xff0c;DolphinDB 携手光大证券&#xff0c;在上海成功举办 D-Day 行业交流会。三十余位来自私募机构的核心策略研发、量化交易员、数据分析专家们齐聚现场&#xff0c;深入交流量化投研交易过程中的经验、挑战及解决方案。 DolphinDB 赋能机构业务平台 来自光…

1877java项目建设平台管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 项目建设平台管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开 发。开发环境为TOMCAT7.0,Myeclipse8.…

java表实体 蛇形转驼峰 正则匹配替换

java表实体 蛇形转驼峰 正则匹配替换 1.匹配寻找正则&#xff1a;([a-z])_([a-z])2.替换结果正则&#xff1a;$1\U$2\E效果如下图所示&#xff1a;

Python第二语言(三、Python函数def)

目录 1. Python函数&#xff08;def 函数名():&#xff09; 1.1 sorted对容器进行排序&#xff1a;无法指定排序规则 1.2 sort对容器自定义排序&#xff1a;可以指定排序规则 1.3 获取变量长度函数&#xff08;len&#xff09; 1.4 函数的定义 1.5 函数-传参定义 1.6 函…