设计模式-组合实体模式
背景
通常我们收快递,有时候上班期间真的没有空去收啊,所有就会委托其他人,或者说让房管代收一下,然后房管会统一放到一个地方,下再我们再去取,而这个统一管理,我们就不用直接在工作期间去收快递,并且最终也可以拿到我人们的快递。
组合实体模式是什么?
组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。
角色:
组合实体(Composite Entity) - 它是主要的实体 bean。它可以是粗粒的,或者可以包含一个粗粒度对象,用于持续生命周期。
粗粒度对象(Coarse-Grained Object) - 该对象包含依赖对象。它有自己的生命周期,也能管理依赖对象的生命周期。
依赖对象(Dependent Object) - 依赖对象是一个持续生命周期依赖于粗粒度对象的对象。
策略(Strategies) - 策略表示如何实现组合实体。
优点:
易拓展:组合实体可以自由增加,遵循了开闭原则;
缺点:
破坏了单一职责,又获取组合体信息又打印组合体破坏了单一职责;
组合实体模式可以干嘛?
通过组合实体模式,通过一个组合实体的实客户端来控制原有的实体,进行创建和数据替换,起到一个统一管理。
个人理解:
就类似于收快递,楼下房管给你统一收了,统一放了。
组合实体模式类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @Auther: Administrator
* @Date: 2020-06-26 11:31
* @Description:依赖对象
*/
public class DependentObject2 {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
/**
* @Auther: Administrator
* @Date: 2020-06-26 11:31
* @Description:依赖对象
*/
public class DependentObject1 {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
/**
*
* 功能描述:粗粒度对象
*
* @param:
* @return:
* @auther: csh
* @date: 2020-06-26 11:45
*/
public class CoarseGrainedObject {
DependentObject1 do1 = new DependentObject1();
DependentObject2 do2 = new DependentObject2();
public void setData(String data1, String data2){
do1.setData(data1);
do2.setData(data2);
}
public String[] getData(){
return new String[] {do1.getData(),do2.getData()};
}
}
/**
* @Auther: csh
* @Date: 2020-06-26 11:46
* @Description:组合体
*/
public class CompositeEntity {
private CoarseGrainedObject cgo = new CoarseGrainedObject();
public void setData(String data1,String data2){
cgo.setData(data1,data2);
}
public String[] getData(){
return cgo.getData();
}
}
/**
* @Auther: csh
* @Date: 2020-06-26 11:49
* @Description:测试组合实体对象
*/
public class Client {
private CompositeEntity compositeEntity = new CompositeEntity();
public void pintData(){
for (String s : compositeEntity.getData()) {
System.out.println("Data:"+s);
}
}
public void setData(String data1,String data2){
compositeEntity.setData(data1,data2);
}
}
/**
* @Auther: csh
* @Date: 2020-06-26 12:04
* @Description:组合实体模式
*/
public class Test {
public static void main(String[] args) {
Client client = new Client();
client.setData("Test","Data");
client.pintData();
client.setData("test2","data2");
client.pintData();
}
}
结果
Data:Test
Data:Data
Data:test2
Data:data2
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
最后
组实合实体跟门面模式,非常相似,同样是一个中心节点,用户的请求都是通过一个对外暴露的实体进行处理,同样存在这个中心节点一但出现问题那系统可能都瘫痪了...就类似于有些小平台,单节点一但哪天并发量上来就直接发挂了...所以在正常场景下,都是通过分布式来布署多节点,并且通过主从互换的,若哪些主节点挂了,子节点马上顶上去。就类似于redis集群哨兵模式一样。
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- Javascript之创建对象
- Leetcode-Easy 136. Single Number
- 2017.10.25水题大作战题解
- Angular开发实践(四):组件之间的交互
- Leetcode-Easy 70. Climbing Stairs
- Angular开发实践(八): 使用ng-content进行组件内容投射
- Angular开发实践(六):服务端渲染
- Leetcode-Easy 657. Judge Route Circle
- 洛谷P1138 第k小整数
- Leetcode-Easy 796. Rotate String
- 2017.10.23解题报告
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法
- 分布式锁,三种实现方式,性能对比分析!
- Linux 中锁定和解锁用户帐户的三种方法
- centos8 安装 nginx的详细教程(图文)
- Ubuntu系统日志配置 /var/log/messages的方法
- 在Ubuntu 14 上安装 Nginx-RTMP 流媒体服务器的教程
- centos8自定义目录安装nginx(教程详解)
- VMware下Centos7桥接方式网络配置步骤详解
- Linux CentOS 6.5 卸载、tar安装MySQL的教程
- Linux CentOS 6.5 ifconfig查询不到ip的解决方法
- 打卡群2刷题总结1009——二叉树的中序遍历
- 解决Ubuntu 18.04安装VMwareTools错误问题
- 对linux下syslogd以及syslog.conf文件的解读说明
- Linux下安装tomcat并部署网站(推荐)
- 解决Linux中ifconfig和addr查看不到ip问题