南宁做网站优化,安徽网络推广和优化,网页美工培训班,麻将网站开发目录 一、组合模式1、组合模式是什么#xff1f;2、组合模式的主要参与者#xff1a; 二、优化案例#xff1a;文件系统1、不使用组合模式2、通过组合模式优化上面代码优化点#xff1a; 三、使用组合模式有哪些优势1、统一接口#xff0c;简化客户端代码2、递归结构处理方… 目录 一、组合模式1、组合模式是什么2、组合模式的主要参与者 二、优化案例文件系统1、不使用组合模式2、通过组合模式优化上面代码优化点 三、使用组合模式有哪些优势1、统一接口简化客户端代码2、递归结构处理方便3、易扩展4、简化客户端操作5、动态组合灵活 四、适用场景五、组合模式的劣势六、在jdk源码中哪些地方应用了组合模式代码举例说明一下1、AWTAbstract Window Toolkit中的组件树1代码分析2JDK 源码中的示例简化3组合模式分析 2、集合框架中的 java.util 包1代码分析2JDK 源码中的示例3组合模式分析 3、小总结 七、总结在这里直接用 OpenAI o1草莓大模型 在日常开发中我们往往忽视了设计模式的重要性。这可能是因为项目时间紧迫或者对设计模式理解不深。其实很多时候我们可能在不经意间已经使用了某些模式。
重要的是要有意识地学习和应用让代码更加优雅和高效。也许是时候重新审视我们的编程实践将设计模式融入其中了。
今天由浅入深重学【组合模式】让我们一起“重学设计模式”。
一、组合模式
1、组合模式是什么
组合模式Composite Pattern是一种结构型设计模式它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户可以像使用单个对象一样使用对象组合简化了复杂结构的处理。
2、组合模式的主要参与者
Component抽象组件定义了对象的接口所有组合对象和叶子节点都应实现它。Leaf叶子节点表示没有子节点的对象即树的末端。Composite组合对象表示拥有子节点的对象。它不仅实现了 Component 接口还能够存储并管理其子节点。
二、优化案例文件系统
文件系统是组合模式的经典案例。文件系统中的文件夹可以包含文件或其他文件夹。无论是文件还是文件夹它们都应该有一些共同的行为例如显示名称或计算大小。
1、不使用组合模式
如果不采用组合模式代码将需要分别处理叶子节点如文件和组合对象如文件夹这会导致代码复杂性增加。没有统一的接口意味着文件和文件夹需要不同的处理逻辑导致代码的重复和不易扩展。
每次添加新的文件类型或子文件夹时都需要修改已有代码增加文件和文件夹的处理逻辑代码会变得难以维护和扩展。
冗余代码Folder 类中有两个集合一个存储文件另一个存储子文件夹。由于没有通用接口必须为文件和文件夹分别编写逻辑。缺乏一致性要操作文件和文件夹时必须分别对待。例如showDetails() 方法中文件和文件夹需要分开处理无法将它们统一成一个对象。扩展性差如果将来想要添加新的类型比如符号链接、压缩文件等必须分别为它们定义类并在每个相关的逻辑中添加处理它们的代码。
public class File {private String name;private int size;public File(String name, int size) {this.name name;this.size size;}public void showDetails() {System.out.println(File: name (Size: size KB));}
}public class Folder {private String name;private ListFile files new ArrayList();private ListFolder subFolders new ArrayList();public Folder(String name) {this.name name;}public void addFile(File file) {files.add(file);}public void addFolder(Folder folder) {subFolders.add(folder);}public void showDetails() {System.out.println(Folder: name);// 显示文件夹中的文件for (File file : files) {file.showDetails();}// 递归显示子文件夹中的内容for (Folder folder : subFolders) {folder.showDetails();}}
}public class Test {public static void main(String[] args) {File file1 new File(Document.txt, 50);File file2 new File(Photo.jpg, 200);Folder folder new Folder(MyFolder);folder.addFile(file1);folder.addFile(file2);File file3 new File(test0.txt, 50);File file4 new File(test1.jpg, 200);Folder folderRoot new Folder(MyFolderRoot);folderRoot.addFile(file3);folderRoot.addFile(file4);folderRoot.addFolder(folder);folderRoot.showDetails();}
}2、通过组合模式优化上面代码
在电子商务网站的产品目录中可以通过组合模式管理产品和产品类别。每个产品叶子节点具有价格和描述产品类别组合对象可以包含其他类别或产品。通过使用组合模式可以简化查询价格、库存和类别层次的操作。
优化点
简化层次结构在系统中产品与类别都遵循相同的接口可以统一处理产品和类别。灵活性可以动态地增加或移除产品和类别提高系统的可扩展性和维护性。
这个模式特别适合应用于具有递归或树形结构的场景。
文件和文件夹可以看作统一的组件处理逻辑一致新增类型时只需实现抽象接口原有代码不需要修改。
/*** 抽象组件*/
public abstract class FileSystemComponent {public abstract void showDetails();
}/*** 叶子节点文件*/
public class File extends FileSystemComponent {private String name;private int size;public File(String name, int size) {this.name name;this.size size;}Overridepublic void showDetails() {System.out.println(File: name (Size: size KB));}
}/*** 组合对象文件夹*/
public class Folder extends FileSystemComponent {private String name;private ListFileSystemComponent components new ArrayList();public Folder(String name) {this.name name;}public void addComponent(FileSystemComponent component) {components.add(component);}Overridepublic void showDetails() {System.out.println(Folder: name);for (FileSystemComponent component : components) {component.showDetails();}}
}public class CombinationClient {public static void main(String[] args) {FileSystemComponent file1 new File(Document.txt, 50);FileSystemComponent file2 new File(Photo.jpg, 200);Folder folder new Folder(MyFolder);folder.addComponent(file1);folder.addComponent(file2);File file3 new File(test0.txt, 50);File file4 new File(test1.jpg, 200);Folder folderRoot new Folder(MyFolderRoot);folderRoot.addComponent(file3);folderRoot.addComponent(file4);folderRoot.addComponent(folder);folderRoot.showDetails();}
}三、使用组合模式有哪些优势
1、统一接口简化客户端代码
组合模式为对象和对象组合提供了统一的接口客户端可以一致地操作单个对象和组合对象而不必区分它们是叶子还是组合。这种一致性减少了处理不同类型对象的复杂度简化了代码。
2、递归结构处理方便
组合模式特别适合处理树形或递归结构如文件系统、组织结构等。通过递归调用可以轻松遍历整个结构无论是文件还是文件夹不必写不同的处理逻辑。
3、易扩展
新增叶子节点或组合对象时只需实现相同的接口不需要修改已有的代码。组合模式具有开放-封闭原则的优势使系统更加灵活、易于扩展。
4、简化客户端操作
客户端不再需要关心对象的具体类型叶子或组合只需处理抽象组件。这使得代码更加简洁也减少了错误处理的复杂性。
5、动态组合灵活
通过组合模式可以动态地组合对象而无需预先定义复杂的类结构。这为复杂对象提供了灵活的处理方式使得系统结构更具弹性。
四、适用场景
树形结构层次结构 组合模式非常适用于需要表示“部分-整体”关系的场景尤其是树形结构。例如文件系统、组织结构图、产品目录树、菜单系统等。 文件系统文件和文件夹之间的层次关系可以通过组合模式来轻松管理。无论是单个文件还是包含子文件夹的文件夹都可以通过相同的方式处理。组织结构图公司中员工和部门之间存在层次结构员工可以属于某个部门部门可以属于其他部门通过组合模式可以方便地管理和展示这种结构。 GUI控件图形用户界面 GUI 组件经常包含其他组件如按钮、窗口、面板等。组合模式可以用来管理这些图形控件让它们统一处理。例如一个窗口可能包含面板面板中包含按钮和文本框这些控件都可以通过相同的接口进行管理和渲染。菜单系统 菜单项可以包含子菜单也可以是普通的菜单项。组合模式可以用于菜单系统的设计使得菜单项和子菜单都实现相同的接口从而简化菜单的显示和操作。产品目录和分类管理 电子商务网站中产品可以属于某个类别类别之间也有层次结构。组合模式可以用于管理产品和类别通过统一接口可以轻松查询、操作或统计不同类别下的产品信息。图形绘制系统 在图形绘制系统中复杂的图形可能是由多个简单图形组成的。组合模式允许将简单图形和复杂图形统一起来处理方便实现图形的递归绘制和操作。权限系统 在权限管理中角色和权限之间可能存在层次关系一个角色可以拥有多个权限权限可以包含子权限。组合模式可以用于简化权限系统的设计使得权限的分配和管理更加灵活。编译器中的抽象语法树AST 编译器在解析源代码时会生成抽象语法树AST其中每个节点可以是语法结构的一个元素如表达式、语句等。通过组合模式编译器可以对这些节点进行统一处理而不需要关心它们的具体类型。
五、组合模式的劣势
虽然组合模式有很多优势但它也有一些潜在的劣势
过度抽象为了实现通用接口可能导致系统设计过于抽象和复杂尤其是在层次结构非常深的情况下增加了理解和维护的难度。性能问题由于组合模式需要递归处理对象结构在大规模、深层次的树形结构中递归操作可能带来性能问题。类型安全问题组合模式统一了叶子节点和组合对象的接口有时可能难以强制类型检查。例如某些操作只对叶子节点有效调用这些操作时可能需要额外的类型判断。
六、在jdk源码中哪些地方应用了组合模式代码举例说明一下
在JDK源码中组合模式被广泛应用于处理树形或层次结构的数据结构和设计最典型的例子之一是 java.awt 包中的 Component 类以及集合框架中的 java.util 包。
以下是两个常见的应用场景
1、AWTAbstract Window Toolkit中的组件树
在 java.awt 包中Component 类和 Container 类使用了组合模式。Container 代表可以包含子组件的对象而 Component 是一个抽象组件代表所有的 GUI 元素。Container 既可以是单个组件叶子也可以是组合组件容器从而形成了一个树形的 GUI 组件层次结构。
1代码分析
Component 类是所有 GUI 元素的基类。Container 类是 Component 的子类它可以包含多个子组件。
2JDK 源码中的示例简化
// java.awt.Component
public abstract class Component {// 省略大量方法public void paint(Graphics g) {// 绘制组件的代码}
}// java.awt.Container
public class Container extends Component {// 存储子组件private ListComponent componentList new ArrayList();public void add(Component comp) {componentList.add(comp);}public void remove(Component comp) {componentList.remove(comp);}Overridepublic void paint(Graphics g) {super.paint(g);// 递归调用子组件的 paint 方法for (Component comp : componentList) {comp.paint(g);}}
}3组合模式分析
Component 是一个抽象类定义了所有组件的通用接口。Container 是一个组合对象包含其他组件并可以递归地管理和绘制这些组件。在使用时GUI 系统可以统一处理 Component 对象不论它是叶子组件如按钮、文本框还是组合组件如面板、窗口。
2、集合框架中的 java.util 包
在 Java 集合框架中List、Set、Map 等接口也使用了组合模式。集合类中既有可以直接存储元素的类如 ArrayList、HashSet也有可以组合其他集合的类如 Collections.unmodifiableList、Collections.synchronizedList 等。
1代码分析
List 接口是所有列表的通用接口。ArrayList 实现了 List 接口代表叶子节点可以直接存储元素。Collections.unmodifiableList 通过组合模式将一个已有的列表封装起来实现不可修改的列表。
2JDK 源码中的示例
// java.util.List (接口)
public interface ListE extends CollectionE {// 定义列表的通用方法boolean add(E e);E get(int index);// 省略其他方法
}// java.util.ArrayList (叶子节点)
public class ArrayListE extends AbstractListE implements ListE {private Object[] elementData;private int size;public ArrayList() {elementData new Object[10];}Overridepublic boolean add(E e) {// 添加元素的逻辑elementData[size] e;return true;}Overridepublic E get(int index) {return (E) elementData[index];}// 省略其他方法
}// java.util.Collections.unmodifiableList (组合对象)
public static T ListT unmodifiableList(List? extends T list) {return new UnmodifiableList(list);
}// 内部类包装一个已有的 List
private static class UnmodifiableListE extends AbstractListE {private final List? extends E list;UnmodifiableList(List? extends E list) {this.list Objects.requireNonNull(list);}Overridepublic E get(int index) {return list.get(index);}Overridepublic boolean add(E e) {throw new UnsupportedOperationException();}
}
3组合模式分析
List 接口是抽象组件定义了所有列表操作的通用方法。ArrayList 是具体的叶子节点可以直接存储和操作元素。UnmodifiableList 是一个组合对象它通过包装另一个 List 实现不可修改的列表并且与其他 List 一样实现了 List 接口。List 和 ArrayList 之间的关系符合组合模式ArrayList 作为叶子节点实现了通用的 List 接口而 UnmodifiableList 通过组合其他列表来扩展功能形成了一个树形的结构。
3、小总结
组合模式在 JDK 中的应用主要体现在处理层次结构、递归结构的场景。AWT 中的 Component 和 Container 类集合框架中的 List 接口及其实现都采用了组合模式。通过这种设计Java 提供了灵活而统一的接口简化了对复杂对象结构的处理同时保持了系统的可扩展性。
七、总结
组合模式Composite Pattern是一种结构型设计模式适用于将对象组合成树形结构来表示“部分-整体”的层次关系。它允许用户像使用单个对象一样操作对象组合简化了复杂结构的处理。组合模式的主要参与者包括抽象组件Component叶子节点Leaf和组合对象Composite。每个组件通过统一接口支持递归处理子节点使得系统更加灵活、易扩展。
以文件系统为例文件夹可以包含文件或其他文件夹。在不使用组合模式时文件和文件夹必须分别处理导致代码复杂性增加且扩展性差。通过组合模式可以使用统一的接口管理文件和文件夹简化层次结构并增强系统的扩展性和灵活性。
组合模式在JDK源码中有广泛应用如 java.awt 中的组件树Component 和 Container 类以及集合框架中的 List、ArrayList 和 Collections.unmodifiableList。这些类通过组合模式处理递归结构和对象组合使得操作统一、灵活。
在这里直接用 OpenAI o1草莓大模型
谷歌浏览器访问https://www.nezhasoft.cn GPT功能
GPT-4o知识问答支持1000token上下文记忆功能最强代码大模型Code Copilot代码自动补全、代码优化建议、代码重构等DALL-E AI绘画AI绘画 剪辑 自媒体新时代私信哪吒直接使用GPT-4o 文章收录于100天精通Java从入门到就业
哪吒数年工作总结之结晶。
哪吒多年工作总结Java学习路线总结搬砖工逆袭Java架构师。 华为OD机试 2023B卷题库疯狂收录中刷题点这里 刷的越多抽中的概率越大每一题都有详细的答题思路、详细的代码注释、样例测试发现新题目随时更新全天CSDN在线答疑。 点击下方名片回复1024获取《10万字208道Java经典面试题总结(2024修订版).pdf 》