`
wangchao_17915566
  • 浏览: 167637 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

了解组合模式

 
阅读更多

      组合模式,一般就是“整体,部分”的概念,在java与模式中举了一个大家经常听过的故事,很形象,从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的内容是:从前有座山......一直这样下去。从这里看出,整体是这个故事,故事里面的故事则是部分。这也是一个简单的组合模式。

      组合模式把整体和部分的关系用树结果表示出来,使得客户端把一个单独的成分对象和复合对象同等对待。

      组合模式分为安全式和透明式,

     首先看看安全式:

     定义接口

public interface Component {
	 public void sampleOperation();
}

 

树枝构建角色是具体的实现类

public class Composite implements Component {

	private Vector componentVector = new Vector();
	
/**
 * 谋个业务方法
 * */
	public void sampleOperation() {
		Enumeration enumeration = components();
		while (enumeration.hasMoreElements()){
			((Component)(enumeration.nextElement())).sampleOperation();
		}
	}
	/**
	 * 聚集管理方法,增加一个子构建对象
	 * */
	public void add(Component component){
		componentVector.add(component);
//		System.out.println("++++++++++"+componentVector.size());
	}
	/**
	 * 聚集管理方法,删除一个子构建对象
	 * */
	public void remove(Component component){
		componentVector.remove(component);
//		System.out.println("----------"+componentVector.size());
	}
	/**
	 * 聚集管理方法,返回聚集的Enumeration对象
	 * */
	public Enumeration components(){
		System.out.println("**********"+componentVector.size());
		return componentVector.elements();
	}
}

 

这里除基本业务方法外,它增加了,add,与remov方法。此方法可以对子构建进行增加与删除。

树叶构建角色也实现抽象构建角色。

public class Leaf implements Component {

	public void sampleOperation() {
		System.out.println("增加叶子");
	}

}

 

最后通过测试看下

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//操作单一方法
		Leaf l= new Leaf();
		l.sampleOperation();

		//构造根枝
		Composite allc = new Composite();
		//构造次枝
		Composite c1 = new Composite();
		((Composite)allc).add(c1);
		//构造叶子
		((Composite)c1).add(new Leaf());
		((Composite)c1).add(new Leaf());
		((Composite)c1).remove(new Leaf());

		allc.sampleOperation();
	}

}

 

从这个测试看出,在枝节上可以构造枝节,在枝节上可以构造叶子 ,并且可以通过remove方法,去掉枝叶。这个也可以再次创建下一级的枝叶。

 

下来说下几个名词:

抽象构件角色(Component):这是个抽象类,一般就是个接口,它定义出公共接口,安全模式里,构件角色并不定义管理子对象的方法

树叶构件角色(Leaf):树叶对象没有下级,只定义原始对象。

树枝构件角色(Composite):代表参加组合的下级子对象的对象,还定义出了管理方法:add,remove

 

透明式:则是将原来写在composite中的管理方法,写在接口当中,这样实现他时就必须实现这两个管理方法,包括叶子,这样就是说叶子并不能管理树枝,而也有着两个方法,并且客户端可以调用。

 

 

 

分享到:
评论
2 楼 gaolegao2008 2009-02-26  
<div class="quote_div">
<p>      组合模式,一般就是“整体,部分”的概念,在java与模式中举了一个大家经常听过的故事,很形象,从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的内容是:从前有座山......一直这样下去。从这里看出,整体是这个故事,故事里面的故事则是部分。这也是一个简单的组合模式。</p>
<p>      组合模式把整体和部分的关系用树结果表示出来,使得客户端把一个单独的成分对象和复合对象同等对待。</p>
<p>      组合模式分为安全式和透明式,</p>
<p>     首先看看安全式:</p>
<p>     定义接口</p>
<pre name="code" class="java">public interface Component {
public void sampleOperation();
}
</pre>
<p> </p>
<p>树枝构建角色是具体的实现类</p>
<pre name="code" class="java">public class Composite implements Component {

private Vector componentVector = new Vector();

/**
* 谋个业务方法
* */
public void sampleOperation() {
Enumeration enumeration = components();
while (enumeration.hasMoreElements()){
((Component)(enumeration.nextElement())).sampleOperation();
}
}
/**
* 聚集管理方法,增加一个子构建对象
* */
public void add(Component component){
componentVector.add(component);
// System.out.println("++++++++++"+componentVector.size());
}
/**
* 聚集管理方法,删除一个子构建对象
* */
public void remove(Component component){
componentVector.remove(component);
// System.out.println("----------"+componentVector.size());
}
/**
* 聚集管理方法,返回聚集的Enumeration对象
* */
public Enumeration components(){
System.out.println("**********"+componentVector.size());
return componentVector.elements();
}
}</pre>
<p> </p>
<p>这里除基本业务方法外,它增加了,add,与remov方法。此方法可以对子构建进行增加与删除。</p>
<p>树叶构建角色也实现抽象构建角色。</p>
<pre name="code" class="java">public class Leaf implements Component {

public void sampleOperation() {
System.out.println("增加叶子");
}

}
</pre>
<p> </p>
<p>最后通过测试看下</p>
<pre name="code" class="java">public class Client {

/**
* @param args
*/
public static void main(String[] args) {
//操作单一方法
Leaf l= new Leaf();
l.sampleOperation();

//构造根枝
Composite allc = new Composite();
//构造次枝
Composite c1 = new Composite();
((Composite)allc).add(c1);
//构造叶子
((Composite)c1).add(new Leaf());
((Composite)c1).add(new Leaf());
((Composite)c1).remove(new Leaf());

allc.sampleOperation();
}

}</pre>
<p> </p>
<p>从这个测试看出,在枝节上可以构造枝节,在枝节上可以构造叶子 ,并且可以通过remove方法,去掉枝叶。这个也可以再次创建下一级的枝叶。</p>
<p> </p>
<p>下来说下几个名词:</p>
<p>抽象构件角色(Component):这是个抽象类,一般就是个接口,它定义出公共接口,安全模式里,构件角色并不定义管理子对象的方法</p>
<p>树叶构件角色(Leaf):树叶对象没有下级,只定义原始对象。</p>
<p>树枝构件角色(Composite):代表参加组合的下级子对象的对象,还定义出了管理方法:add,remove</p>
<p> </p>
<p>透明式:则是将原来写在composite中的管理方法,写在接口当中,这样实现他时就必须实现这两个管理方法,包括叶子,这样就是说叶子并不能管理树枝,而也有着两个方法,并且客户端可以调用。</p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p> </p>
1 楼 hanjs 2008-12-04  
((Composite)allc).add(c1);  
        //构造叶子  
        ((Composite)c1).add(new Leaf());  
        ((Composite)c1).add(new Leaf());  
        ((Composite)c1).remove(new Leaf()); 

不知道我为何需要进行强制类型转换?都已经是这个类型了

相关推荐

    CompositePattern.rar

    本资源是基于设计模式,通过C++语言实现组合模式。它实现虽然有些简单,但是主要是方便我们去了解组合模式思路。

    java23种设计模式

    011组合模式8 \7 e- [% }# B5 p2 S 012状态模式 M% S6 a. `. h# h! h. F 013代理模式8 g( r/ i6 W3 q9 z; ~$ O 014复合模式 015桥接模式 016生成器模式 017责任链模式 018蝇量模式 019解释器模式 020中介者模式 021...

    python3 简单实现组合设计模式

    主要介绍了python3 简单实现组合设计模式的方法,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

    java版本的设计模式的实现demo

    工厂模式是另一种常用的创建型模式,它将对象的创建与使用进行了解耦。根据不同的情况,可以实现简单工厂模式、工厂方法模式或抽象工厂模式。 4. 观察者模式 观察者模式是典型的行为型模式,它定义了对象之间的一对多...

    Android源码学习之组合模式定义及应用

    将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性,需要了解的朋友可以参考下

    [源代码] 《易学 设计模式》 随书源代码

    第14章 如法炮制:组合模式 (Composite) 第15章 源源不断:享元模式 (Flyweight) 第16章 按部就班:模板方法模式 (TemplateMethod) 第17章 风吹草动:观察者模式 (Observer) 第18章 变化多端:状态模式 (State) 第19...

    《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解

    本文实例讲述了Javascript面向对象程序设计组合模式。分享给大家供大家参考,具体如下: 概述 关于组合模式的定义:组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单...

    软件设计模式知识点

    3. 组合模式(Composite):将对象组合成树形结构以表示"部分-整体"的层次结构。 4. 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 5. 外观模式(Facade):为子系统中的一组接口提供一个一致的界面...

    论设计模式的重要性-《重学设计模式》

    其实各设计模式之间都是有共通之处的(在java中是抽象、继承、多态、组合的综合运用),有些看起来十分类似但又能解决不同的问题,这些都是前人总结的经验,你也可以组合出更适用于你所编写的程序的一种模式。

    快速理解Java设计模式中的组合模式

    主要介绍了快速理解Java设计模式中的组合模式,具有一定参考价值,需要的朋友可以了解下。

    GoF 的 23 种设计模式

    中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不...

    设计模式——基于C#的工程化实现及扩展

    第3篇结构型模式的重点在于如何通过灵活的体系组织不同的对象,并在此基础上完成更为复杂的类型(或者类型系统),而参与组合的各类型之间始终保持尽量松散的结构关系;第4篇行为型模式关注于应用运行过程中算法的...

    React模式.pdf

    使⽤ React 有基础了解的开发者。本书并不 是完整的 React 使⽤指南,⽽是对 React 流 ⾏的概念及设计模式的介绍。这些范式或多 或少都是由开源社区所引⼊的,其主要⽬的 在于引导你的抽象思维。例如,它讨论的不 是...

    JAVA设计模式例程-装饰模式

    JAVA设计模式例程-装饰模式-的例程,看完以后基本上能对JAVA上实现装饰模式能有所了解,个人认为常各种模式并不是为了死套各种模式,而应该是灵活的在项目中结合实际情况而用各种模式的组合应用,呵呵!但前提是得对...

    简单了解设计模式中的装饰者模式及C++版代码实现

    而装饰提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。 有关这些内容在讨论中进一步阐述。 模式选择 装饰模式典型的结构图为: 在 结 构 图 中 , ConcreteComponent 和装饰需 要 有 同 样 的 ...

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造者模式10 1.1.4 单态模式13 1.1.5 原型模式15 1.2 构造型模式17 1.2.1 适配器模式17 1.2.2 桥接模式19 1.2.3 组合模式23 1.2.4 装饰模式26 ...

    二十三种设计模式【PDF版】

    如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 建筑和软件中模式之异同 A. 创建模式 设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证...

    建造者模式(Builder Pattern)原理图

    3. **提供统一的接口**:客户端(即使用该模式的代码)只需要知道所需的建造者类型,而不需要了解复杂对象的内部组成部分和装配方式。这样,客户端代码就可以专注于高层逻辑,而不是对象的创建细节。 4. **封装构建...

    JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】

    虽然在 ES6 中,已经出了 class 的语法,貌似好像不用了解 ES5 中的这些老东西了,但是越深入学习,你会发现理解这些模式的重要性。 在本文中,我会描述 7 种常用的创建自定义类型的模式:工厂模式、构造函数模式、...

    JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)

     既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考《面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式》,接下来讲一般通过那些方法完成...

Global site tag (gtag.js) - Google Analytics