设计模式-组合模式

news/2024/10/5 9:23:10
组合模式

组合模式,也称为整体部分模式,他的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性。(树形结构)
组合与聚合的关系:组合生命周期保持一致。聚合具有不同的生命周期。

角色:
  • 抽象根节点(Component):定义系统各层次对象的共有方法和属性,可以预先定义一些默认行为和属性。
  • 树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构。
  • 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历最小的单位
应用场景:
  • 希望客户端可以忽略组合对象与单个对象的差异时;
  • 对象层次具备整体和部分,呈树形结构

组合模式,在代码具体实现上,有两种不同的方式:透明组合模式和安全组合模式
透明组合模式,直白一点地说,就是将所有需要的业务都写在抽象根节点上,并给出默认行为。树枝节点,叶子节点重写所需要方法,不需要的不重写。安全组合模式,抽象接口仅仅定义共同的逻辑,树枝节点和叶子节点各自定义自己特有的逻辑。

安全模式举例如下:

package com.jdwa.combination;public abstract class Directory {protected String name;public Directory(String name){this.name = name;}public abstract void show();
}
package com.jdwa.combination;public class File extends Directory{public File(String name){super(name);}@Overridepublic void show() {System.out.println(this.name);}
}
package com.jdwa.combination;import com.jdwa.builder.Director;import java.util.ArrayList;
import java.util.List;public class Folder extends Directory{private List<Directory> dirs;private Integer level;public Folder(String name,Integer level){super(name);this.level = level;this.dirs = new ArrayList<>();}public void show() {System.out.println(this.name);for (Directory dir:this.dirs){if (this.level != null){for (int i = 0 ;i < this.level; i++){System.out.print("    ");}for (int i = 0 ; i < this.level; i++){if (i == 0 ) System.out.print("+");System.out.print("-");}}dir.show();}}public boolean add(Directory dir){return this.dirs.add(dir);}public boolean remove(Directory dir){return this.dirs.remove(dir);}public Directory get(int index){return this.dirs.get(index);}public void list(){for (Directory dir : this.dirs){System.out.println(dir.name);}}
}
package com.jdwa.combination;public class Client {public static void main(String[] args) {System.out.println("===========安全组合模式===========");File qq = new File("QQ.exe");File wechat = new File("Wechat.exe");Folder office = new Folder("办公软件",2);File word = new File("Word.exe");File ppt = new File("PPT.exe");File excel = new File("Excel.exe");office.add(word);office.add(ppt);office.add(excel);Folder wps = new Folder("金山软件",3);wps.add(new File("WPS.exe"));office.add(wps);Folder root = new Folder("根目录",1);root.add(qq);root.add(wechat);root.add(office);System.out.println("===========show()===========");root.show();System.out.println("===========list()===========");root.list();}
}

运行结果:

===========安全组合模式===========
===========show()===========
根目录+-QQ.exe+-Wechat.exe+-办公软件+--Word.exe+--PPT.exe+--Excel.exe+--金山软件+---WPS.exe
===========list()===========
QQ.exe
Wechat.exe
办公软件
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

iptables笔记

摘要 四链五表4表:filter表,作用是过滤某些包,这是防火墙工作的基础, 例如:云厂商的安全组实现 一般不带 -t 参数,则默认使用filter表 nat表,作用是实现网络地址转换 raw, 作用是将命中规则的包,跳过其它表的处理,它的优先级最高。 mangle, 作用是根据规则修改数据包的…

2024wf中考数学难题tj

睿频:中考量太大,太折磨人了。 凭记忆口胡。多选最后一个:条件:AE//GC,EF垂直平分线。 平行+垂直平分线,A证弧其实就是证角,D证菱形也差不多。 \(A\):弧DA = 弧AG 。 证:$\Delta AEH \cong \Delta EHC $ , 平行加等腰,直接ac平分角,o。 \(D\):证\(AEFC\)菱形。俩垂直…

Oracle 性能调优 10053事件

思维导图10053事件概述 我们在查看一条SQL语句的执行计划时,只看到了CBO最终告诉我们的执行计划结果,但是我们并不知道CBO为何要这样做。 特别是当执行计划明显失真时,我们特别想搞清楚为什么CBO会做出这样的一个选择,那么就可以用10053事件来分析SQL分析过程的trace文件。…

ZooKeeper源码解读

ZooKeeper源码分析 1. 服务器构成 群首(leader),追随者(follower),观察者(observer)本质上都是服务器。在实现服务器主要抽象概念是请求处理器。请求处理器是对处理流水线上不同阶段的抽象,每个服务器实现一个请求处理器的序列。 zookeeper服务端有两种模式:单机的独…

当我在焦虑的时候我在思考些啥-我是如何理解人生的

1. 前言本文主要记录下笔者对于人生的思考,仅一家之言,可能会有很多经不起推敲的逻辑,如果你因此被本文误导了,笔者概不负责(狗头保命~) BTW,起个啥标题好呢,副标题又该取啥好呢,起名困难症犯了,纠结啊。。。2. 为什么突然思考起人生这个话题 2.1. 原因一:与其焦虑…

ajax跨域解决方案

1.何为跨域AJAX跨域问题是指浏览器出于安全考虑,限制了一个源(域名、协议、端口)的脚本与另一个源的资源进行交互。通俗的说,当前页面的域名、协议、端口必须与ajax访问地址一致,才能正常通信,否则会造成跨域2.解决方案浏览器开放限制:浏览器下载插件(Access-Control-A…

ZooKeeper漫谈

ZooKeeper漫谈 1.什么是Zookeeper Zookeeper 是一个分布式协调服务的开源框架。主要作用是为分布式系统提供协调服务,包括但不限于:分布式锁、统一命名服务、配置管理、负载均衡、主控服务器选举以及主从切换等。 ZooKeeper本质上是一个分布式的小文件存储系统。提供类似与文…

余数的余数

问题:计算大于7的任意数除以7的余数再除以2的余数 函数公式解决:=MOD(MOD(A1,7),2)