`
wangwengcn
  • 浏览: 175548 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

15.组合模式(Composite Pattern)

阅读更多

1.定义

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式又叫做树形模式。其在项目开发中涉及树的结构都会想到组合模式。

 

2.引子

我们计算机的文件系统就是一个典型组合模式的使用,文件分为两种:一、文件夹,二、文件。其中文件夹可以包含文件,也可以包含子文件夹。如果我们用资源管理器打开某个文件夹,发现它展开在左侧的是一个树形结构。
而我们的组合模式就是为了解决这种树形结构的递归问题。这种问题在生活中很常见,比如某个机关的人事关系图。

 

 

3.组合模式的使用场景

  • 维护和展示部分-整体关系的场景,比如树形菜单、文件和文件夹管理。
  • 从一个整体中能独立出部分模块或功能的场景。

下面以人事关系的代码为例讲解该模式的实现:

 

package _15CompositePattern;

/**
 * 某公司的抽象员工类
 * 无论领导或者普通职员都有的属性
 */
public abstract class Corp {

	private String name;// 姓名
	private int salary;// 薪水
	
	public Corp(String name, int salary)
	{
		this.name = name;
		this.salary = salary;
	}
	
	public void prinInfo()
	{
		System.out.println("Name: " + name + ", Salary:" + salary);
	}
	
}
 
package _15CompositePattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 领导类
 * 出了拥有普通员工的权限,偶尔还要关怀一下下属,要不他们不干活
 */
public class Branch extends Corp {

	// 手下的所有下属
	private List<Corp> subList = new ArrayList<Corp>();
	
	public Branch(String name, int salary) {
		super(name, salary);
	}
	
	// 增加一个下属,这个下属可能是小兵,也可能是领导(当然职位比我低)
	public void addSub(Corp sub) {
		subList.add(sub);
	}

	// 获得我的所有下属
	public List<Corp> getSubList() {
		return subList;
	}
}
 
package _15CompositePattern;

/**
 * 普通员工类
 * 除了自己不需要关心任何别人的事情
 */
public class Leaf extends Corp {

	public Leaf(String name, int salary) {
		super(name, salary);
	}
}
 
package _15CompositePattern;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Corp bossCorp = new Branch("张三", 100000);
		// 设置了张三是一个boss,给他加小弟的代码就不详细写了
		// ...
		printAllCorpInfo(bossCorp);
	}
	
	// 给我根节点,我打印出全部信息
	public static void printAllCorpInfo(Corp root) 
	{
		if(root instanceof Leaf)
		{
			root.prinInfo();
		}
		else
		{
			for(Corp sub : ((Branch)root).getSubList())
			{
				printAllCorpInfo(sub);
			}
		}
	}

}

 

4.组合模式的三个角色

  • Component抽象构件角色:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性,比如我们例子中的name属性,prinInfo()方法就封装在抽象类中
  • Leaf叶子构件:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位
  • Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树状结构

5.组合模式的类型

组合模式中必须提供对子对象的管理方法,不然无法完成对子对象的添加删除等等操作,也就失去了灵活性和扩展性。但是管理方法是在Component中就声明还是在Composite中声明呢?
上面例子中给出的代码叫做安全模式,只在Composite里面声明所有的用来管理子类对象的方法(如下图所示)。这样就避免了上一种方式的安全性问题,但是由于叶子和分支有不同的接口,所以又失去了透明性。

另一种方式是在Component里面声明所有的用来管理子类对象的方法,以达到Component接口的最大化(如下图所示)。目的就是为了使客户看来在接口层次上树叶和分支没有区别——透明性。但树叶是不存在子类的,因此Component声明的一些方法对于树叶来说是不适用的。这样也就带来了一些安全性问题。
 《设计模式》一书认为:在这一模式中,相对于安全性,我们比较强调透明性。对于第一种方式中叶子节点内不需要的方法可以使用空处理或者异常报告的方式来解决。
 参考一下Java中File类型的实现,它同时包含了文件和文件夹的操作方法,可以看出是一种透明类型的组合模式。

 

6.组合模式的优点

  • 高层模块调用简单:一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
  • 节点自由增加:想要增加一个节点,只需要找到它的父节点就行了,非常方便。

7.组合模式的缺点

组合模式有一个非常明显的缺点,看到我们场景类中,树枝和树叶直接使用了实现类。这在面向接口编程上是很不恰当的,与依赖倒置原则冲突。

 

8.组合模式的注意事项

只要是树形结构就要考虑使用组合模式,只要是要体现局部和整体的关系的时候,而且这种关系还比较深,考虑一下组合模式吧。

分享到:
评论

相关推荐

    组合模式 Composite Pattern

    **组合模式**(Composite Pattern)是一种常用的结构型设计模式,主要用于构建具有层次结构的对象系统。它允许客户端以一致的方式处理单个对象和组合对象,简化了高层模块的调用。通过组合模式,可以将多个对象组织成...

    设计模式之组合模式(Composite Pattern)

    组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...

    Composite Pattern(组合模式)

    例如,`Composite Pattern.oob`可能展示了Component、Composite和Leaf类的关系,而`Composite Pattern.oom`可能包含了一些示例对象的实例,展示如何通过组合模式构建树形结构并执行操作。 **使用和优势** 组合模式...

    C#设计模式_设计模式_C#_

    组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器...

    设计模式代码——c#

    9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) ...

    23种设计模式 (创建型,结构型,行为型)

    组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代...

    c++-设计模式之组合模式(Composite Pattern)

    组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...

    组合模式(Composite Pattern)原理图

    组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...

    32种设计模式

    组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command ...

    设计模式面面观(11):组合模式(Composite Pattern)-结构型模式

    **设计模式面面观:组合模式(Composite Pattern)** 组合模式是软件工程中的一种结构型设计模式,它允许我们以树形结构来表示部分与整体的关系,使得客户端代码可以一致地处理单个对象和对象组合。在组合模式中,...

    CompositePattern.rar

    在"CompositePattern.rar"这个资源中,我们可以预期找到以下内容: 1. `Component`类:定义了公共接口,如`add()`, `remove()` 和 `operation()` 方法。 2. `ConcreteComponent`类:实现Component接口,代表树形...

    Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现

    迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中有着广泛的应用。这两种模式都属于GoF(Gang of Four)设计模式,旨在解决特定的问题,提升代码...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    设计模式_组合模式.zip

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

    设计模式实验报告-组合模式.docx

    组合模式(Composite Pattern)是一种结构型设计模式,它允许用户将对象组合成树形结构来表示部分-整体层次结构。该模式使得用户对单个对象和组合对象的使用具有一致性。 #### 实验内容 实验内容主要包括设计和实现...

    系统开发二十三种设计模式

    7. 组合模式(Composite Pattern):将对象组合成树形结构以表示部分-整体关系,使得用户可以对单个对象和组合对象进行一致的处理。 8. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,...

    C# 24种设计模式代码示例

    11. 组合模式(Composite Pattern):允许你将对象组合成树形结构,以表示“部分-整体”的层次结构。 12. 责任链模式(Chain of Responsibility Pattern):避免将请求的发送者和接收者耦合在一起,将多个处理者...

    C++设计模式基础教程.pdf

    10. 组合模式(Composite Pattern):将对象组合成树形结构以表示”局部..整体”的层次结构。 11.外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面。 行为型模式 行为型模式主要用来对类或...

    C#23种设计模式【完整】.pdf

    9. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。 10. 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,使得子系统更加易于使用...

Global site tag (gtag.js) - Google Analytics