设计模式总结篇系列:组合模式(Composite)

简介:

在探讨Java组合模式之前,先要明白几个概念的区别:继承、组合和聚合。

继承是is-a的关系。组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系。

组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象。如人和手之间的关系,人都没了,还何来手?

聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等函数形式),如人有一台电脑的关系。

总体说来,组合关系相对聚合而言整体和部分关系感更强一些。

回到正题,组合模式中当然在组合对象中含有被组合对象的引用,只是不同的是,组合模式在概念上更加严格,通常是指引用的被组合对象类型就是组合对象的类型。如此一来,使得组合对象和被组合对象处理起来具有一致性。当然,前提是组合被对象和被组合对象在本身的概念层次上具有此一致性。

最为经典的体现组合模式的例子是具有树形结构特点的类定义。对于树形结构中的每个结点,由于父结点的孩子节点有可能是有自己的孩子结点,因此,利用组合模式,将所有结点统一设计成同一种类型即可。

1.定义树中结点类, 每个结点都有结点名称,父节点和孩子结点:

复制代码
 1 class TreeNode {
 2 
 3     private String name;
 4     private TreeNode parent;
 5     private Vector<TreeNode> children = new Vector<TreeNode>();
 6 
 7     public TreeNode() {
 8     }
 9 
10     public TreeNode(String name) {
11         this.name = name;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public TreeNode getParent() {
23         return parent;
24     }
25 
26     public void setParent(TreeNode parent) {
27         this.parent = parent;
28     }
29 
30     public Vector<TreeNode> getChildren() {
31         return children;
32     }
33 
34     public void setChildren(Vector<TreeNode> children) {
35         this.children = children;
36     }
37 
38     // 添加孩子结点
39     public void addChild(TreeNode child) {
40         children.add(child);
41     }
42 
43     // 删除子结点
44     public void removeChild(TreeNode child) {
45         children.remove(child);
46     }
47 
48     // 获取子结点
49     public Enumeration<TreeNode> getChileren() {
50         return children.elements();
51     }
52 
53 }
复制代码

2.客户端类,创建树:

复制代码
 1 public class Tree {
 2 
 3     private TreeNode root;
 4 
 5     public Tree() {
 6 
 7     }
 8 
 9     public Tree(String treeName) {
10         root = new TreeNode(treeName);
11     }
12 
13     public static void main(String[] args) {
14         Tree tree = new Tree("A");
15         TreeNode nodeB = new TreeNode("B");
16         TreeNode nodeC = new TreeNode("C");
17         nodeB.addChild(nodeC);
18         tree.root.addChild(nodeB);
19         System.out.println("build the tree finished!");
20     }
21 
22 }
复制代码

 

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类: 设计模式

本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3758182.html,如需转载请自行联系原作者
目录
相关文章
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 组合模式
js设计模式【详解】—— 组合模式
353 7
|
设计模式 Java 定位技术
【设计模式】【结构型模式】组合模式(Composite)
一、入门 什么是组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和组合对
462 10
|
设计模式 存储 安全
「全网最细 + 实战源码案例」设计模式——组合模式
组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。它允许客户端以一致的方式对待单个对象和对象集合,简化了复杂结构的处理。组合模式包含三个主要组件:抽象组件(Component)、叶子节点(Leaf)和组合节点(Composite)。通过这种模式,客户端可以统一处理简单元素和复杂元素,而无需关心其内部结构。适用于需要实现树状对象结构或希望以相同方式处理简单和复杂元素的场景。优点包括支持树形结构、透明性和遵循开闭原则;缺点是可能引入不必要的复杂性和过度抽象。
604 22
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
363 2
Java设计模式:组合模式的介绍及代码演示
|
设计模式 存储 安全
Java设计模式-组合模式(13)
Java设计模式-组合模式(13)
256 2
|
设计模式
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
对抗软件复杂度问题之组合(Composite)方法设计模式是什么,如何解决
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
|
设计模式 Java
Java设计模式之组合模式详解
Java设计模式之组合模式详解
|
设计模式
组合模式-大话设计模式
组合模式-大话设计模式
197 0
|
设计模式 Java
【设计模式】文件目录管理是组合模式吗?
【设计模式】文件目录管理是组合模式吗?
240 0

热门文章

最新文章