设计模式-组合模式

ops/2024/10/19 11:46:15/

目录

🧂1.组合设计模式

🥓2.优缺点

🌭3.核心角色

🍿4.代码实现 


1.组合设计模式

  • 1.又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象
  • 2.组合模式使得用户可以使用一致的方法操作单个对象和组合对象
  • 3.部分-整体对象的基本操作多数是一样的,但是应该还会有不一样的地方
  • 4.核心:组合模式可以使用一棵树来表示

2.优缺点

  • 优点

    • 1、高层模块调用简单。
    • 2、节点自由增加。
  • 缺点 

    • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

3.核心角色

  • 1.组件:定义了组合中所有对象的通用接口,可以是抽象类或接口。它声明了用于访问和管理子组件的方法,包括添加、删除、获取子组件等。
  • 2.叶子节点:表示组合中的叶子节点对象,叶子节点没有子节点。它实现了组件接口的方法,但通常不包含子组件。
  • 3.复合节点:表示组合中的复合对象,复合节点可以包含子节点,可以是叶子节点,也可以是其他复合节点。它实现了组件接口的方法,包括管理子组件的方法。
  • 4.客户端:通过组件接口与组合结构进行交互,客户端不需要区分叶子节点和复合节点,可以一致地对待整体和部分。

4.代码实现 

文件之间有相应的子文件关系

java">/*** 组件-根节点,抽象类,通用方法和属性*/
public abstract class Root {private String name;public Root(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}/*** 抽象方法*/public abstract void addFile(Root root);public abstract void removeFile(Root root);public abstract void disPlay(int depth);
}
java">/*** 叶子节点:没有叶子节点*/
public class File extends Root {public File(String name) {super(name);}@Overridepublic void addFile(Root root) {}@Overridepublic void removeFile(Root root) {}@Overridepublic void disPlay(int depth) {StringBuilder sb = new StringBuilder();for (int i = 0; i < depth; i++) {sb.append("_");}System.out.println(sb.toString() + this.getName());}
}
java">/*** 符合节点-文件夹可以有子文件夹或子文件*/
public class Folder extends Root {List<Root> folders = new ArrayList<>();public Folder(String name) {super(name);}public List<Root> getFolders() {return folders;}public void setFolders(List<Root> folders) {this.folders = folders;}@Overridepublic void addFile(Root root) {folders.add(root);}@Overridepublic void removeFile(Root root) {folders.remove(root);}@Overridepublic void disPlay(int depth) {StringBuilder sb = new StringBuilder();for (int i = 0; i < depth; i++) {sb.append("_");}System.out.println(sb.toString() + this.getName());for (Root r : folders) {r.disPlay(depth + 2);}}
}
java">public class Main {public static void main(String[] args) {//创建根目录Folder root = new Folder("E://");//创建子文件夹Folder myComputer = new Folder("我的电脑");Folder desktop = new Folder("桌面");//创造子文件File file = new File("hello.java");//建立文件关系root.addFile(file);root.addFile(desktop);root.addFile(myComputer);myComputer.addFile(file);root.disPlay(0);}
}


http://www.ppmy.cn/ops/4110.html

相关文章

Rich,最强大的可视化界面和文本输出python库

Rich,可美化界面和文本输出最强python库 什么是Rich 库&#xff1f; Rich是一个用于在 Python 中创建美观、颜色丰富的命令行界面和文本输出的库. Rich有那些功能&#xff1a; Rich库可以帮助开发者创建漂亮的终端输出,包含丰富的格式化选项,如颜色、样式、表格、进度条等. …

Java数据结构-二叉树

目录 1. 树与二叉树1.1 树1.2 二叉树1.3 树的相关概念1.4 特殊的二叉树1.5 二叉树性质1.6 二叉树的存储与表示方法 2. 二叉树遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.4 层序遍历 3. 二叉树基本操作3.1 求树的所有结点个数3.2 求叶子结点个数3.3 求第k层结点个数3.4 求二叉树…

Redis-键值设计

Redis-键值设计 1.设置key的规范 遵循基本格式&#xff1a;【业务名称】&#xff1a;【数据名】&#xff1a;【id】 可读性强&#xff0c;在客户端的情况下使用:如果前缀相同会分目录层级长度不超过44字节 string数据结构的三种类型&#xff0c;在44字节之内是embstring 内存…

差速机器人模型LQR 控制仿真——路径模拟

LQR路径跟踪要求路径中带角度&#xff0c;即坐标&#xff08;x,y,yaw&#xff09;&#xff0c;而一般我们的规划出来的路径不带角度。这里通过总结相关方法&#xff0c;并提供一个案例。 将点路径拟合成一条完整的线路径算法 将点路径拟合成一条完整的线路径是一个常见的问题…

轮腿机器人-五连杆正运动学解算

轮腿机器人-五连杆与VMC 1.五连杆正运动学分析2.参考文献 1.五连杆正运动学分析 如图所示为五连杆结构图&#xff0c;其中A&#xff0c;E为机器人腿部控制的两个电机&#xff0c;θ1,θ4可以通过电机的编码器测得。五连杆控制任务主要关注机构末端C点位置&#xff0c;其位置用直…

Python | Leetcode Python题解之第32题最长有效括号

题目&#xff1a; 题解&#xff1a; class Solution:def longestValidParentheses(self, s: str) -> int:stack[]maxL0nlen(s)tmp[0]*n #标记数组cur0for i in range(n):if s[i](:stack.append(i)else:if stack:jstack.pop()if s[j](:tmp[i],tmp[j]1,1 #匹配成…

Navicat for MySQL 使用基础与 SQL 语言的DDL

一、目的&#xff1a; Navicat for MySQL 是一套专为 MySQL 设计的高性能数据库管理及开发 工具。它可以用于任何版本 3.21 或以上的 MySQL 数据库服务器&#xff0c;并支持大 部份 MySQL 最新版本的功能&#xff0c;包括触发器、存储过程、函数、事件、视图、 管理用户等。…

微信小程序浮标,可以拖动,自动靠边隐藏一半客服图标功能

不多说&#xff0c;直接上代码。全屏拖动无抖动&#xff0c;中间停留自动靠边&#xff0c;拖动隐藏一半&#xff0c;可自己根据代码改动为自己想要的效果 js代码 import { tpStaticUrl,basictpStaticUrl } from "../../../envConfig"; let app getApp(); Componen…