`

设计模式-组合模式

阅读更多

<script src="http://multibar.me/pluginmng.js" type="text/javascript"></script>

七:合成 (Composite) 模式

合成模型模式属于对象的结构模式,有时又叫做部分 - 整体模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系,也就是说,它把部分和整体的关系用树结构表示出来。合成模式可以使客户端将单纯元素与复合元素同等看待。

涉及角色:

抽象构件 (Component) 角色:一个抽象角色,它给参加组合的对象规定一个接口。给出共有的接口及其默认行为。

树叶构件 (Leaf) 角色:代表参加组合的树叶对象。一个树叶没有下级的子对象,定义出参加组合的原始对象的行为。

树枝构件 (Composite) 角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

合成模式的实现根据所实现接口的区别分为两种形式,分别称为安全式和透明式。

透明方式:在 Component 里面声明所有的用来管理子类对象的方法,例如 add(), remove(), getChild() 等。这样的好处是所有的构建类都有相同的接口,在客户端看来,树叶类对象与合成类对象的区别起码在接口层次上消失了,客户端可以同等地对待所有的对象。缺点是不够安全,因为树叶类对象和合成类对象在本质上有区别的。

安全方式:在 Composite 里面声明所有的用来管理子对象的方法,此种做法是安全的,因为树叶类型的对象根本就没有管理子对象的方法,所以,如果客户端对树叶类对象使用这些方法时,编译器就会出错。缺点是不够透明,因为树叶类和合成类具有了不同的接口。

 

使用场景:

(1)    需要描述对象的部分和整体的等级结构。

(2)    需要客户端忽略掉个体构件和组合构建的区别。

优缺点:

合成模式可以很容易地增加新种类的构件,可以使客户端变得很容易设计 ( 因为客户端不需要知道构件是树叶还是树枝 ) ;但是使用合成模式后,控制树枝构件的类型就不太容易,还有,用继承的方法来增加新的行为很困难。

 

 

/**安全方式**/

package com.co.patterns.composite.savety;
/**
 * 抽象构件角色
 * @author laotan
 */
public abstract class Graphics {

	public abstract void draw();
}

/**
 * 树叶节点构件
 * @author laotan
 */
public class Line extends Graphics {

	public void draw() {}
	
}
public class Circle extends Graphics {

	public void draw() {
	}
}


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

/**
 * 树枝节点构件角色
 * @author laotan
 */
public class Picture extends Graphics {

	private List<Graphics> gList = new ArrayList<Graphics>();
	
	public void draw() {
		for (int i=0; i<gList.size(); i++) {
			Graphics g = gList.get(i);
			g.draw();
		}
	}
	// 一下是对构件集合的管理方法
	public void add(Graphics g) {
		gList.add(g);
	}
	
	public void remove(Graphics g) {
		gList.remove(g);
	}
	
	public Graphics getChild(int i) {
		return gList.get(i);
	}
}

 

 

 

分享到:
评论

相关推荐

    java常用设计模式-组合模式

    java常用设计模式-组合模式

    设计模式-组合模式(讲解及其实现代码)

    设计模式-组合模式(讲解及其实现代码)

    c++设计模式-结构型模式-组合模式

    c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...

    设计模式--组合模式java例子

    设计模式--组合模式java例子

    JAVA-设计模式-结构型模式-组合模式

    JAVA-设计模式-结构型模式-组合模式

    java设计模式-组合模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    设计模式之-----组合模式 java

    自己最近才写的一个设计模式----组合模式小例子,请大家评价

    设计模式-组合实体

    ios平台中通过最简单的代码讲解组合实体模式,可在博客http://blog.sina.com.cn/s/blog_161d504630102wxis.html中查看简单解释

    设计模式专题之(九)组合模式---设计模式组合模式示例代码(python--c++)

    设计模式专题之(九)组合模式---设计模式组合模式示例代码(python--c++)

    设计模式课件大全

    设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式...

    设计模式-C++

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    组合模式-空军指挥系统.zip

    本资源包含一个由Java设计模式中的“组合模式”实现的“空军指挥系统”的全部源代码。注意:本资源含有的代码量比较大,对于急需“项目实战”的朋友很有帮助!需要的朋友可以下载哦!!!!!!!!!!

    c++设计模式-结构型模式-桥接模式

    c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...

    设计模式--C++

    2.2.3 组合模式 272.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor 和 Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持...

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

    设计模式实验报告

    系统架构技能之设计模式-组合模式

    一、我们上篇主要讲述了结构型模式中的外观模式,外观模式作为结构型模式中的一个简单又实用的模式,外观模式通过封装细节来提供大粒度的调用, 直接的好处就是,封装细节,提供了应用写程序的可维护性和易用性。...

    设计模式_组合模式.zip

    这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...

    23种设计模式 -设计模式图解.7z

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

Global site tag (gtag.js) - Google Analytics