`

设计模式学习笔记——组合模式

阅读更多

 

组合模式

又称合成模式,属于对象的结构模式,也被叫做部分-整体模式。

合成模式将对象组织到树结构中,使客户端将单纯元素和复合元素同等看待。

 

传统的盗图


合成模式主要涉及的3个角色

1 抽象构件(Component):抽象角色,对参加组合的对象规定了统一接口

2 树叶构件(Leaf):代表参加组合的对象

3 树枝构件(Composite):代表参加组合的含有子对象的对象

 

合成模式有2种形式

安全式

在Composite树枝构件中声明管理子类对象的方法,但是这种方法不够透明

透明式

在Component抽象构件中就定义所有管理子类对象的方法,但是这种方式并不安全,并且在Leaf树叶中需要对无用方法进行平庸实现(返回null,置空等)

GOF中相对于安全性更推崇透明性

 

下面是我的一个透明式的小Demo

首先是抽象角色接口

 

public interface Component {
	void display();
	void add(Component component);
	void del(Component component);
	void getChild();
}

 定义了组件应该具有的方法规范

之后Composite树枝构件,方便起见给了他们各自一个名称

 

public class Composite implements Component {
	private ArrayList<Component> childList=new ArrayList();
	private String name;
	public Composite(String name){
		this.name="Composite: "+name;
	}
	public void display() {
		System.out.println(name);
	}
	public void add(Component component) {
		childList.add(component);
	}
	public void del(Component component) {
		childList.remove(component);
	}
	public void getChild() {
		System.out.println(name+"'s children");
		for(int i=0;i<childList.size();i++){
			childList.get(i).display();
		}
	}
}

可以看到其中有管理构件的add,del等方法

最后是Leaf叶子构件,其中与管理相关的方法都采取了置空

 

public class Leaf implements Component {
	private String name;
	public Leaf(String name){
		this.name="Leaf: "+name;
	}
	public void display() {
		System.out.println(name);
	}
	public void add(Component component) {
	}
	public void del(Component component) {
	}
	public void getChild() {
	}
}

构件一个类来测试一下结果:

 

public class CompositePattern {
	public static void main(String[] args) {
		Composite root=new Composite("root");
		Composite branch1=new Composite("branch1");
		Composite branch2=new Composite("branch2");
		Leaf leaf1=new Leaf("Leaf1");
		Leaf leaf2=new Leaf("Leaf2");
		Leaf leaf3=new Leaf("Leaf3");
		root.add(branch1);
		root.add(leaf1);
		branch1.add(branch2);
		branch1.add(leaf2);
		branch1.add(leaf3);
		root.display();
		branch1.display();
		branch1.getChild();
		branch1.del(leaf3);
		branch1.getChild();
	}
}

即一颗下列形式的树

root——branch1 ——branch2

| |

——leaf1 ——leaf2

|

——leaf3

 输出结果

 

Composite: root

Composite: branch1

Composite: branch1's children

Composite: branch2

Leaf: Leaf2

Leaf: Leaf3

Composite: branch1's children

Composite: branch2

Leaf: Leaf2

 

组合模式的优点

1 使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。 

2 更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。这一点符合开闭原则的要求,对系统的二次开发和功能扩展很有利。

缺点

不容易限制组合中的构件

 

(转)使用组合模式时考虑的问题

1 明显的给出父对象的引用。在子对象里面给出父对象的引用,可以很容易的遍历所有父对象。有了这个引用,可以方便的应用责任链模式。

2 在通常的系统里,可以使用享元模式实现构件的共享,但是由于合成模式的对象经常要有对父对象的引用,因此共享不容易实现。

3 有时候系统需要遍历一个树枝结构的子构件很多次,这时候可以考虑把遍历子构件的结果暂时存储在父构件里面作为缓存。

4 关于使用什么数据类型来存储子对象的问题,在示意性的代码中使用了ArrayList,在实际系统中可以使用其它聚集或数组等。

5 客户端尽量不要直接调用树叶类中的方法,而是借助其父类(Component)的多态性完成调用,这样可以增加代码的复用性

 

 

参考链接:

http://www.iteye.com/topic/285021

http://blog.csdn.net/rocket5725/article/details/4308476

  • 大小: 8.5 KB
分享到:
评论

相关推荐

    学习笔记——资料

    【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...

    C++学习笔记——继承和组合

    组合是一种将其他类的对象作为成员变量使用的设计模式。这种方式允许将多个简单类组合成更复杂的类,而不会出现继承关系。组合的优点在于它提供了一种更加灵活的方式来实现代码重用,并且更容易理解和维护。 #### 2...

    HeadFirst设计模式笔记

    在本笔记中,我们将探讨设计模式的核心概念,并通过具体的例子——`PizzaIngredientFactory`来实践这些模式。 首先,设计模式分为三大类:创建型、结构型和行为型模式。创建型模式关注对象的创建,如单例模式...

    HTML5学习笔记(总结提炼版)——001

    本学习笔记将聚焦于HTML5的基础知识,包括其新特性、元素和最佳实践。 一、HTML5的新特性 1. 语义化标签:HTML5引入了新的语义化标签,如、、、和等,这些标签有助于更好地组织内容,提高可读性和可访问性。 2. ...

    软件设计师软考笔记.zip

    这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...

    学习笔记 MHT2

    【学习笔记 MHT2】是一份综合性的IT学习资料,主要涵盖了JavaScript编程、软件开发工具、Web服务器技术、编码解码方法以及设计模式等多个领域的知识。以下是对这些知识点的详细阐述: 1. **JavaScript经典技巧**:...

    Android学习笔记(十六)——碎片之间进行交互(附源码)

    碎片间的交互是Android应用设计中不可或缺的一部分,特别是在构建复杂且动态的用户界面时。本篇笔记将深入探讨如何在Android中实现碎片之间的交互,并附带源码供参考。 首先,理解碎片的基本概念。碎片是一个可以...

    我的uml学习笔记(在尚学堂学习的)

    《UML学习笔记——探索软件建模的利器》 UML,全称为统一建模语言,是软件开发中的一种重要工具,尤其在需求分析和设计阶段发挥着关键作用。它并非一种具体的分析或设计方法,而是图形化表示法,帮助我们清晰地表达...

    java学习笔记

    ### Java学习笔记知识点详解 #### Java 平台与开发概述 - **Java平台分类:** - **J2SE(Java SE):** 标准版,适用于桌面应用程序开发。 - **J2EE(Java EE):** 企业版,专为Web应用和服务端应用程序设计。 -...

    实用J2EE框架学习笔记

    **J2EE框架学习笔记** Java 2 Platform, Enterprise Edition(J2EE)是一个由Oracle公司维护的开源平台,用于构建分布式、多层的企业级应用。它提供了多种服务、API和组件模型,使得开发者能够创建可扩展且健壮的...

    Eclipse插件开发学习笔记(ch11-12)

    本篇将基于"《Eclipse插件开发学习笔记》(ch11-12)"的内容,深入讲解Eclipse插件开发中的两个关键概念——视图(Views)和操作(Actions)。 **第11章 操作(Actions)** 在Eclipse插件开发中,操作(Actions)是...

    java io流学习笔记1

    Java IO流是Java平台中...总结,Java IO流是Java平台中处理输入输出的基础,其丰富的类库和设计模式为开发者提供了灵活、高效的数据传输手段。通过深入理解和熟练运用这些知识点,能够更好地应对各种IO相关的编程挑战。

    MSP432学习笔记7:定时器A中断配套资源

    在本文中,我们将深入探讨MSP432微控制器中的定时器A中断功能,并通过一个实际的案例——“定时器A中断开关灯”来详细解析其工作原理和配置过程。MSP432P402r是一款由德州仪器(TI)推出的高效能、低功耗的嵌入式微...

    狂神笔记md文件. zip

    zip"包含了一系列关于Java后端开发的重要框架——Spring、SpringMVC、MyBatis以及SpringBoot的学习笔记。这些笔记由狂神讲解,是针对初学者和进阶者的一份宝贵资源,旨在帮助读者深入理解和掌握这些技术。 ...

    显示技术习题——测试自己

    2. 颜色模式:显示器通常使用RGB(红绿蓝)颜色模型来显示颜色,通过不同比例的三原色组合,可以形成几乎所有的颜色。 3. 显示器类型:主要有LCD(液晶显示器)、LED(发光二极管)、OLED(有机发光二极管)和QLED...

    传智播客ssh+ssm五大框架笔记.zip

    【标题】"传智播客ssh+ssm五大框架笔记.zip"所涵盖的是Java Web开发中的两种主流框架组合——Spring、Struts2和Hibernate(SSH)以及Spring MVC和MyBatis(SSM)。这些框架在现代企业级应用开发中扮演着重要角色,...

    Vue.js学习笔记之 helloworld

    1. MVVM架构:MVVM是一种设计模式,它将应用分为三个部分——Model(模型)、View(视图)和ViewModel(视图模型)。Model代表数据模型,View是用户界面,而ViewModel是作为View和Model的中介,它负责监听Model的...

Global site tag (gtag.js) - Google Analytics