组合模式(Composite Pattern)

意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用:1、您想表示对象的部分-整体层次结构(树形结构)。2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

类图:这里从类图可以很好的理解,恩,复习的时候再画用于深化~

代码:这里我使用了四人帮《java设计模式》一书中的经典例子做演示,简化了一些内容,以便理解其核心-结构


1、组合接口

package com.pat.composite;
/**
* 组合类接口,普通叶子和含有很多叶子的枝干都实现本接口
* @author ZX
*
*/
public interface Composite {
void operation();
void add(Composite leaf);
void remove(); }

2、单独的实现类-叶子、

package com.pat.composite;
/**
* 绿色的树叶
* @author ZX
*
*/
public class GreenLeaf implements Composite{
@Override
public void operation() {
System.out.println("摘一片绿叶"); }
@Override
public void add(Composite leaf) {
// TODO Auto-generated method stub }
@Override
public void remove() {
// TODO Auto-generated method stub } }
package com.pat.composite;
/**
* 黄色的树叶
* @author ZX
*/
public class YellowLeaf implements Composite{
@Override
public void operation() {
System.out.println("摘一片黄叶");
} @Override
public void add(Composite leaf) {
}
@Override
public void remove() {
}
}

3、枝干实现类-枝干上有许多叶子:

package com.pat.composite;

import java.util.ArrayList;
import java.util.List; /**
* 树枝,上面有很多树叶
* @author ZX
*
*/
public class Branch implements Composite{
//树枝上所有的叶子集合
List<Composite> leafs = new ArrayList<>();
@Override
public void operation() {
operateAll();
}
@Override
public void add(Composite leaf) {
}
@Override
public void remove() {
}
public void operateAll() {
for(Composite leaf:leafs) {
leaf.operation();
} }
//后早方法
public Branch() {
//这里我简单添加了一些树叶类,未使用传入参数,核心不在于此
leafs.add(new GreenLeaf());
leafs.add(new GreenLeaf());
leafs.add(new GreenLeaf());
leafs.add(new YellowLeaf());
leafs.add(new YellowLeaf());
leafs.add(new YellowLeaf());
} }

4、测试类:

package com.pat.composite;

public class Test {
public static void main(String[] args) {
System.out.println("===========================");
Composite green = new GreenLeaf();
green.operation();
System.out.println("===========================");
Composite yellow = new YellowLeaf();
yellow.operation();
System.out.println("===========================");
Composite branch = new Branch();
branch.operation();
System.out.println("===========================");
}
}

5、结果:

===========================
摘一片绿叶
===========================
摘一片黄叶
===========================
摘一片绿叶
摘一片绿叶
摘一片绿叶
摘一片黄叶
摘一片黄叶
摘一片黄叶
===========================

【设计模式】结构型05组合模式(Composite Pattern)的更多相关文章

  1. 设计模式(七)组合模式Composite(结构型)

    设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...

  2. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  4. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  5. 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释

    组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...

  6. 浅谈设计模式--组合模式(Composite Pattern)

    组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...

  7. 二十四种设计模式:组合模式(Composite Pattern)

    组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...

  8. python 设计模式之组合模式Composite Pattern

    #引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...

  9. 设计模式-12组合模式(Composite Pattern)

    1.模式动机 很多时候会存在"部分-整体"的关系,例如:大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.在软件开发中也是这样,例如,文件系统中的文件与文件夹.窗体 ...

随机推荐

  1. QT开发环境的建立以及QTE4.6.3、tslib1.4的移植过程

    1.首先是建立Linux开发环境1.1.在windowsXP下安装博创公司提供的虚拟机软件VMware Workstation,版本为VMware-workstation-full-7.0.1-227 ...

  2. 取消scrollView上下拉升

    if (ios_Vewsion_5_Or_Above) { _scrollView.bounces = NO; } else { for (id subview in _scrollView.subv ...

  3. 在Android程序中使用Modbus协议时报 java.net.SocketException: recvfrom failed: ECONNRESET解决办法

    最近在开发基本Modbus协议的Android端PLC控制程序,C#版程序没有任何问题,移到JAVA下出现各种问题,其中比较苦恼的是java.net.SocketException: recvfrom ...

  4. OpenGL(十) 截屏并保存BMP文件

    BMP文件格式 BMP图像又称为Bitmap(位图),是Windows系统中广泛采用的图像格式.BMP文件的数据按照从文件头开始的先后顺序分为四个部分: 我们一般见到的图像以24位图像为主,即R.G. ...

  5. glibc头文件和宏定义

    头文件没啥好说的,无非就是" "和< >的区别,这估计只要是学过C/C++的人都明白.现在的编译器对头文件的包含顺序没有要求,但老的C实现则不一样.当然,我们现在无需关 ...

  6. 【C#】【WPF】如何读写app.config文件

    WPF生成的项目中会有.exe.config.一般是系统默认配置的 格式是xml格式,C#的项目可以直接读写这些文件.方法代码如下. public static string GetConnectio ...

  7. Java Policy

    # What The policy for a Java™ programming language application environment (specifying which permiss ...

  8. PySide——Python图形化界面入门教程(四)

    PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral ...

  9. ReportViewer,RDLC 报表开发之个性化样式

    原文:ReportViewer,RDLC 报表开发之个性化样式 报表开发中,客户对样式提出了要求: 1.工具栏上显示每页条数 2.只导出Excel,不需要下拉菜单. 3.报表上显示的图表,分页时,每页 ...

  10. 零元学Expression Blend 4 - Chapter 18 用实例了解互动控制项「CheckBox」II

    原文:零元学Expression Blend 4 - Chapter 18 用实例了解互动控制项「CheckBox」II 延续上一章的CheckBox教学,本章将以实作继续延伸更灵活的运用CheckB ...