博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】(十)组合模式(Composite Pattern)
阅读量:2039 次
发布时间:2019-04-28

本文共 2266 字,大约阅读时间需要 7 分钟。

在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣服与衣柜、以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。

1. 组合模式介绍

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

2. 组合模式的结构

组合模式包含以下主要角色。

  1. 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)
  2. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
  3. 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

3. 组合模式的实现

定义抽象构件:

package com.siyi.compositepattern;public interface Component {    public void operation();}

 定义树叶构件:

package com.siyi.compositepattern;//树叶构件public class Leaf implements Component {    String name;    public Leaf(String name) {        this.name = name;    }    @Override    public void operation() {        System.out.println(name);    }}

定义树枝构建:

package com.siyi.compositepattern;import java.util.ArrayList;//树枝构件public class Composite implements Component {    String name;    ArrayList
children = new ArrayList
(); public Composite(String name){ this.name = name; } public void add(Component c) { children.add(c); } public void remove(Component c) { children.remove(c); } public Component getChild(int i) { return children.get(i); } @Override public void operation() { System.out.println(name); }}

Main方法:

package com.siyi.compositepattern;public class Main {    public static void main(String[] args) {        Composite root = new Composite("root");        Composite c = new Composite("c");        Component leaf1 = new Leaf("1");        Component leaf2 = new Leaf("2");        Component leaf3 = new Leaf("3");        root.add(c);        root.add(leaf1);        c.add(leaf2);        c.add(leaf3);        tree(root,0);    }    public static void tree(Component c, int depth) {        for(int i=0; i

运行结果:

root--c----2----3--1

4. 组合模式的优缺点

优点:

  1. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
  2. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

缺点:

  1. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
  2. 不容易限制容器中的构件;
  3. 不容易用继承的方法来增加构件的新功能;

转载地址:http://oryof.baihongyu.com/

你可能感兴趣的文章
MyBatis 分页插件 PageHelper 使用方法
查看>>
AbstractQueuedSynchronizer 源码分析
查看>>
分布式以客户为中心的一致性
查看>>
java 注解
查看>>
CAS:乐观锁实现
查看>>
压力测试工具Apache ab
查看>>
Linux - Shell
查看>>
怎样成为优秀的软件模型设计者?
查看>>
解决spring和struts配合问题
查看>>
嵌入式系统Linux内核开发工程师必须掌握的三十道题
查看>>
产品管理系列(一)---优秀的产品经理所具有的素质
查看>>
架构师之路(5)---IoC框架
查看>>
ExtJS 实现的Web文件管理系统
查看>>
SOA架构师注意的问题
查看>>
最佳拍档:首席市场官与首席技术官
查看>>
CIO领导力必会的八大诀窍
查看>>
微软技术节(TechFest 2010)最前沿技术汇总
查看>>
SQL 操作结果集 -并集、差集、交集、结果集排序
查看>>
详解索引连接类型
查看>>
托管堆与垃圾收集
查看>>