转自:http://alaric.iteye.com/blog/1910919
组合模式(Composite)就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。
树图结构一般包含一个根节点,若干个树枝和叶子节点。如下图:
可以用一个类图描述树结构的静态结构,把根节点当做树枝节点来描述,同时和叶子节点具有共同的父类:树结构的类图,其实就是组合模式的简略类图,最上面为抽象节点,左下方为叶子节点,右下方为树枝节点,它含有其他的节点。
1、抽象构建角色(component):作为抽象角色,给组合对象的统一接口。
2、树叶构建角色(leaf):代表组合对象中的树叶对象。
3、树枝构建角色(composite):参加组合的所有子对象的对象,并给出树枝构构建对象的行为。
组合模式在现实中使用很常见,比如文件系统中目录和文件的组成,算式运算,android里面的view和viewgroup等控件,淘宝产品分类信息的展示等都是组合模式的例子。还有个故事:从前山里有座庙,庙里有个老和尚,老和尚对象小和尚讲故事说,从前山里有个庙......退出循环的条件是听厌烦了,或者讲的人讲累了。
这个模式的举例最多的是公司员工的例子。我们这里也以故事雇员为例子来描述:
- package composite;
- /**
- *
- *作者:alaric
- *时间:2013-7-20下午5:11:41
- *描述:员工和领导的统一接口
- */
- public interface Worker {
- public void doSomething();
- }
- package composite;
- /**
- *
- *作者:alaric
- *时间:2013-7-20下午5:59:11
- *描述:普通员工类
- */
- public class Employe implements Worker {
- private String name;
- public Employe(String name) {
- super();
- this.name = name;
- }
- @Override
- public void doSomething() {
- System.out.println(toString());
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return "我叫"+getName()+",就一普通员工!";
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- package composite;
- import java.util.Iterator;
- import java.util.List;
- import java.util.concurrent.CopyOnWriteArrayList;
- /**
- *
- *作者:alaric
- *时间:2013-7-20下午5:14:50
- *描述:领导类
- */
- public class Leader implements Worker {
- private List<Worker> workers = new CopyOnWriteArrayList<Worker>();
- private String name;
- public Leader(String name) {
- super();
- this.name = name;
- }
- public void add(Worker worker){
- workers.add(worker);
- }
- public void remove(Worker worker){
- workers.remove(worker);
- }
- public Worker getChild(int i){
- return workers.get(i);
- }
- @Override
- public void doSomething() {
- System.out.println(toString());
- Iterator<Worker> it = workers.iterator();
- while(it.hasNext()){
- it.next().doSomething();
- }
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return "我叫"+getName()+", 我是一个领导,有 "+workers.size()+"下属。";
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- package composite;
- /**
- *
- *作者:alaric
- *时间:2013-7-20下午5:49:37
- *描述:测试类
- */
- public class Client {
- /**
- *作者:alaric
- *时间:2013-7-20下午5:49:32
- *描述:
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Leader leader1 = new Leader("张三");
- Leader leader2 = new Leader("李四");
- Employe employe1 = new Employe("王五");
- Employe employe2 = new Employe("赵六");
- Employe employe3 = new Employe("陈七");
- Employe employe4 = new Employe("徐八");
- leader1.add(leader2);
- leader1.add(employe1);
- leader1.add(employe2);
- leader2.add(employe3);
- leader2.add(employe4);
- leader1.doSomething();
- }
运行结果如下:
我叫张三, 我是一个领导,有 3个直接下属。
我叫李四, 我是一个领导,有 2个直接下属。
我叫陈七,就一普通员工!
我叫徐八,就一普通员工!
我叫王五,就一普通员工!
我叫赵六,就一普通员工!
上面员工关系的的树形结构如下:
上面例子给出的组合模式抽象角色里,并没有管理子节点的方法,而是在树枝构建角色,这种模式使得叶子构建角色和树枝构建角色有区分,客户端要分别对待树叶构建角色和树枝构建角色,好处是客户端对叶子节点不会调用管理的方法,当调用时,在编译时就会报错,所以也称安全模式。相对安全模式,还有一种透明模式,就是在抽象角色里面添加管理方法,如下图:
这种做法是对客户端来说叶子和树枝都是一致的接口,相对透明,但是叶子节点在调用管理方法是编译时不会报错,运行时才报错,所以不够安全。两种做法均有利弊,使用时要根据具体情况而权衡。
相关推荐
NULL 博文链接:https://lvwenwen.iteye.com/blog/1549415
Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》
4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...
设计模式趣味学习(复习) 设计模式趣味学习(复习) 设计模式与足球(一) 设计模式与足球(二) 设计模式与足球(三) 设计模式与足球(四) 设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人...
策略模式工作坊陈述我们希望扩展在之前的研讨会中开发的保存策略(JSON 和 XML)的功能,添加缓存、加密 (AES) 和操作日志记录服务。 这些服务是可选的,客户可能希望组合这些服务,无论使用哪种保存策略,这些服务...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
pattern/src/structure/composite //12.6组合模式 pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 ...
pattern/src/structure/composite //12.6组合模式 pattern/src/structure/flyweight //12.7享元模式 pattern/src/behavior/strategy //13.1策略模式 pattern/src/behavior/templatemethod //13.2模板方法模式 ...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
组合模式 装饰模式 外观模式 享元模式 代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 ...
本文来自51cto,文章主要介绍了策略模式、观察者模式、装饰模式、单例模式以及饿汉模式等的相关内容。泛化=实现>组合>聚合>关联>依赖一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类依赖于Car类...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...