java_设计模式_组合模式_Composite Pattern(2016-08-12)
概念:
组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
类图:
涉及角色:
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
举例如下:
//Component : 组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。
abstract class Component {
protected String name; public Component(String name) {
this.name = name;
} public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Display(int depth);
} //Leaf : 表示叶节点对象。叶子节点没有子节点。
class Leaf extends Component { public Leaf(String name) {
super(name);
} @Override
public void Add(Component c) {
System.out.println("Can not add to a leaf");
} @Override
public void Remove(Component c) {
System.out.println("Can not remove from a leaf");
} @Override
public void Display(int depth) {
String temp = "";
for (int i = 0; i < depth; i++) {
temp += '-';
}
System.out.println(temp + name);
} } //Composite : 定义枝节点行为,用来存储子部件,在 Component 接口中实现与子部件相关的操作。例如 Add 和 Remove。
class Composite extends Component { private List<Component> children = new ArrayList<Component>(); public Composite(String name) {
super(name);
} @Override
public void Add(Component c) {
children.add(c);
} @Override
public void Remove(Component c) {
children.remove(c);
} @Override
public void Display(int depth) { String temp = ""; for (int i = 0; i < depth; i++) {
temp += '-';
} System.out.println(temp + name); for (Component c : children) {
c.Display(depth + 2);
} } } //Client : 通过 Component 接口操作结构中的对象。
public class CompositePattern { public static void main(String[] args) { Composite root = new Composite("root"); root.Add(new Leaf("Leaf A")); root.Add(new Leaf("Leaf B")); Composite compX = new Composite("Composite X"); compX.Add(new Leaf("Leaf XA")); compX.Add(new Leaf("Leaf XB")); root.Add(compX); Composite compXY = new Composite("Composite XY"); compXY.Add(new Leaf("Leaf XYA")); compXY.Add(new Leaf("Leaf XYB")); compX.Add(compXY); root.Display(1);
}
}
1、想要表示对象的部分-整体层次结构。
2、想要客户端忽略组合对象与单个对象的差异,客户端将统一地使用组合结构中的所有对象。
组合模式让可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。
关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果想要描述这样的数据结构,那么可以使用组合模式。
java_设计模式_组合模式_Composite Pattern(2016-08-12)的更多相关文章
- java_设计模式_命令模式_Command Pattern(2016-08-09)
理解还不到位,先窜出来.等过一阵子再看,再理解. 定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 类型:行为类模式 类 ...
- java_设计模式_外观模式_Facade Pattern(2016-08-09)
外观模式/门面模式 1.概念 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个高层接口,这个接口使得这子系统更容易使用. 2.UML 由于外观模式的结构图过于抽象,因此把它稍稍具体点. ...
- java_设计模式_工厂模式_Factory Pattern(2016-08-04)
工厂模式主要是为创建对象提供了接口.工厂模式按照<Java与模式>中的提法分为三类: (1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory ...
- java_设计模式_状态模式_State Pattern(2016-08-16)
定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 类图: 状态模式所涉及到的角色有: ● 环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,同时维护一个 ...
- java_设计模式_迭代器模式_Iterator Pattern(2016-08-12)
迭代子(Iterator)模式又叫游标(Cursor)模式,是对象的行为模式. 定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: 如果要问java中 ...
- java_设计模式_策略模式_Strategy pattern(2016-07-15)
感受:将算法从方法级别,提升到类级别.之后利用java多态,来切换不同的算法实现不同的功能. 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- 【设计模式】组合模式 Composite Pattern
树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...
随机推荐
- (已解决 7.8号)leecode 分词利用词典分词 word break
不戚戚于贫贱,不汲汲于富贵 ---五柳先生 Given a string s and a dictionary of words dict, determine if s can be se ...
- Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback开发实例
原文:Android图形系统之Surface.SurfaceView.SurfaceHolder及SurfaceHolder.Callback之间的联系 Surface是原始图像缓冲区(raw buf ...
- Yii快速入门教程
Ⅰ.基本概念一.入口文件入口文件内容:一般格式如下:<?php$yii=dirname(__FILE__).'/../../framework/yii.php';//Yii框架位置$config ...
- Java SAX Schema Validation
It is possible to turn on XML Schema validation during parsing with a SAXParser. Here is how it look ...
- Jquery Mobile左右滑动效果
首先在一个页面里面定义两个< div data-role="page">,这里为了突出重点,就没有写出footer和header.定义的页面如下: <body&g ...
- 如何在WIN7中关闭JAVA自动更新
在win7系统上面安装了JAVA JRE或JDK后,就会启动一个jusched,它会定时检查更新,每次开机都会推荐更新或者升级,可能有的朋友在win7下无论如何都关不掉java客户端的自动更新,而又不 ...
- IO(Input Output)流__字节流
续: ------->>>>字节流 IntputStream OutputStream 需求:想要操作图片数据,就需要用到字节流. 读写操作: FileOutputStrea ...
- SSH-KeyGen 的用法 【转载】
SSH-KeyGen 的用法 secureCrt通过密钥登录 做法:1.登录A机器 2.ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或 ...
- chrome 插件 vimium 快捷键大全
DESCRIPTION vimium是一款让你在chrome浏览器能方便地使用键盘操作浏览器的插件.虽然和firefox相比还有些许不足(比如不能按到一些按钮之类的),但是vimium还是做到了能在9 ...
- 再次轻度破解EXE文件
在经历股市多年的大起大落.大赚大赔之后.痛定思痛.深切感到在金融市场拼搏.必须建立健全交易纪律守则,严格运行. 这套完整的纪律守则,就是"交易系统". 在很多方面,它与一般的专家系 ...