组合模式(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. IOC学习1

    学习蒋金楠的 ASP.NET Core中的依赖注入(1):控制反转(IoC) 而来,这篇文章经典异常.一定要多读.反复读. 这篇文章举了一个例子,就是所谓的mvc框架,一开始介绍mvc的思想,由一个d ...

  2. 编程军规 —— Java 篇

    提高代码的可读性,规避容易出现的错误. 0. 共性 对象或引用的非空性判断: 强制类型转换时: 函数返回时: 函数的输入参数: 任务执行的成功或失败判断: 文件打开:网络连接:数据库连接: 内存申请: ...

  3. WPF中的菜单模板

    原文:WPF中的菜单模板 资源字典代码如下: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xa ...

  4. ThreadingTest(线程测试)领先的白框进入这个行业

    测试一直是黑色的,白点.在一般情况下,因为白盒测试需要逻辑思维能力是比较高的技术要求比一般开发商的项目经验和谨慎甚至更高,和较长的测试时间,用于单元测试,昂贵的工具,因此,国内企业普遍忽视白盒测试.这 ...

  5. ORA-00600: internal error code, arguments: [4194], [53], [41], [], [], [], [], []

    真的不动,关闭同事开发测试IBM 3650server它直接关系到电源插头行??? 第二天加点重新启动之后oracle 打开报错ORA-00600: internal error code, argu ...

  6. OnNavigatedTo 和 Loaded 的比较

    直接上结果: OnNavigateTo :是在导航完成,在控件或者页面加载前(之间)调用. Loaded :是在页面准备好并且在控件加载完成后调用. 参考资料: 1.https://stackover ...

  7. go语言学习之路(一)

    Go 语言简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发, ...

  8. You don't have permission to access / on this server问题的解决.

    vhosts.conf配置文件中虚拟主机的配置如下,Options Indexes FollowSymLinks 后面添加 ExecCGI <VirtualHost 192.168.10.82: ...

  9. Win8 Metro(C#)数字图像处理--2.45图像雾化效果算法

    原文:Win8 Metro(C#)数字图像处理--2.45图像雾化效果算法 [函数名称]   图像雾化         AtomizationProcess(WriteableBitmap src,i ...

  10. asp.net文件流下载的代码摘要

    try { var workbook = new XLWorkbook(); if (Workbook != null) { workbook = Workbook; } if (this.Expor ...