OO模式-Composite
组合模式也叫做“部分-总体”模式,这样事实上定义也就非常明显了,正好和数据结构的知识相相应。把对象组合成树形结构以表示“部分-总体”的层次结构。
先看类图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVvMDY1MDAw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="447" height="304" alt="">
首先分析一下这个类图,Leaf和Composite是同辈的,都是继承父类Component,又由于Component中存在Leaf子类,所以他和Component还存在着聚合关系
举一个非经常见的样例,我们天天对着电脑。和各种文件,目录打交道,这不就是一个非常好地组合模式吗?
来看看类图:
来看看详细的实现代码:
AbstractFile为组合中的对象声明接口,实现全部类共同拥有接口的默认行为。
- package composite;
- import java.util.*; //加入引用
- public abstract class AbstractFile {
- protected String name; // 定义name字段
- public void printName() {
- System.out.println(name);
- }
- // 通常都用add和remove方法来提供添加或移除树叶或树枝的功能
- public abstract boolean addChild(AbstractFile file); // 添加
- public abstract boolean removeChild(AbstractFile file); // 移除
- // 一个集合,存放摘要文件的子文件的对象
- public abstract List<AbstractFile> getChildren();
- }
File为子类文件,继承父类,也是树中所谓的叶子节点。叶子节点是没有子节点的,所以父类所谓的方法并不能实现,返回true和null
- package composite;
- import java.util.*;
- public class File extends AbstractFile {
- public File(String name) {
- this.name = name;
- }
- //文件并没有加入的能力,它仅仅是一个单独的个体
- public boolean addChild(AbstractFile file) {
- return false;
- }
- //对于文件本身,已经是叶子节点了。所以也无删除子文件的功能
- public boolean removeChild(AbstractFile file) {
- return false;
- }
- // 因为File已经是叶子节点了。所以就不存在集合这一说,所以这种方法返回的是空值
- public List<AbstractFile> getChildren() {
- return null;
- }
- }
Folder为子类目录,相同也继承于父类。可是此类仅仅是一个普通的节点,里边依然包括叶子节点。
- package composite;
- import java.util.*;
- public class Folder extends AbstractFile {
- private List<AbstractFile> childList ;
- public Folder(String name) {
- this.name = name;
- //用来建立一个集合保存子文件
- this.childList = new ArrayList<AbstractFile>();
- }
- //加入子文件
- public boolean addChild(AbstractFile file) {
- return childList.add(file);
- }
- //删除子文件
- public boolean removeChild(AbstractFile file) {
- return childList.remove(file);
- }
- // 子类的返回类型应该和父类的定义保持一致
- public List<AbstractFile> getChildren() {
- return childList;
- }
- }
最后来看看client是怎样调用和打印的
- package composite;
- import java.util.List;
- public class Client {
- public static void main(String[] args) {
- // TODO 自己主动生成的方法存根
- // 构造一个树形的文件、文件夹结构
- AbstractFile rootFolder = new Folder("c:\\");
- AbstractFile compositeFolder = new Folder("composite");
- AbstractFile windowsFolder = new Folder("windows");
- AbstractFile file = new File("TestComposite.java");
- rootFolder.addChild(compositeFolder);
- rootFolder.addChild(windowsFolder);
- compositeFolder.addChild(file);
- // 打印文件夹文件树
- printTree(rootFolder);
- }
- private static void printTree(AbstractFile ifile) {
- ifile.printName();
- List<AbstractFile> children = ifile.getChildren();
- if (children == null)
- return;
- for (AbstractFile file : children) {
- printTree(file); // 打印方法的调用
- }
- }
- }
透明方式与安全方式
在File子类中,他所谓的各种方法都是不实行的,可是却依然存在。这样的方式就叫做“透明方式”;这样做的优点就是叶子节点和枝节点对于外界没有差别,它们具备全然一致的行为接口;可是问题也会非常明显的。那就是在File中那些所谓的方法的存在是毫无意义的;
假设不想让其做无用功,也就是把File子类中的无意义的方法都去掉,这样的方式叫做“安全方式”;可是因为是不透明的,所以他们就不能具有一致的接口了,这样反而添加了其复杂性,client的调用须要再添加其对应的推断。
什么时候使用组合模式?
1)需求中体现的是“部分-总体”的层次的结构时,使用此模式;
2)用户希望忽略组合对象与单个对象的不同,统一地使用组合结构中的全部的对象的时候,使用此模式;
最后总结:
每一个模式事实上都是须要慢慢理解的,真正的懂得了它的精髓所在,那当再看到类似的字眼的时候就会有亲近的感觉,对于组合模式总结为下面几点:
- 组合模式提供一个结构,可同一时候包容个别对象和组合对象;
- 同意客户对个别对象以及组合对象一视同仁;
- 组合结构内的随意对象都称为组件,组件能够是组合,也能够是叶子节点;
- 在实现组合模式时,有很多设计上的折衷。
这时候就要就情况选择透明方式还是安全方式了。
OO模式-Composite的更多相关文章
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- 浅谈设计模式--组合模式(Composite Pattern)
组合模式(Composite Pattern) 组合模式,有时候又叫部分-整体结构(part-whole hierarchy),使得用户对单个对象和对一组对象的使用具有一致性.简单来说,就是可以像使用 ...
- 合成模式(Composite)-结构型
原理 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 有时候又叫做部分-整体 ...
- 二十四种设计模式:组合模式(Composite Pattern)
组合模式(Composite Pattern) 介绍将对象组合成树形结构以表示"部分-整体"的层次结构.它使得客户对单个对象和复合对象的使用具有一致性.示例有一个Message实体 ...
- 设计模式(七)组合模式Composite(结构型)
设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- 【设计模式】组合模式 Composite Pattern
树形结构是软件行业很常见的一种结构,几乎随处可见, 比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...
- 组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
组合模式(合成模式 COMPOSITE) 意图 将对象组合成树形结构以表示“部分-整体”的层次结构. Composite使得用户对单个对象和组合对象的使用具有一致性. 树形结构介绍 为了便于理解, ...
- 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释
组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...
随机推荐
- 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?
1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...
- Linux离线安装redis集群
一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,联网环境安装较为简单,这里只说脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网,服务 ...
- 第三讲:post-processsing with vcs+ files
1,dump wave by system function $vcdpluson(level_number,module_instance,....|net_or_reg) $vcdplusoff ...
- 给Django中的url起名字
url反转 =>reverse 1.from django.shortcuts import reverse 2. 利用reverse函数对URL名称进行反转 reverse(url名称 ...
- SSM整合shiro
采用maven构建项目 1pom.xml中加入shiro依赖 <!-- shiro --> <dependency> <groupId>org.apache.shi ...
- centos7 ftp 500 OOPS: cannot change directory:/var/ftp/xutong/
在设置多用户登录的时候 该指定的用户xutong对于上级目录/var/ftp 没有访问权限 修改一下上级目录的权限 chmod /var/ftp 对于ftp多用户访问的配置修改也做一个记录 以是设置F ...
- FZU- Problem 1147 Tiling,递推坑题,大数水过~~
Problem 1147 Tiling Time Limit: 1000 mSec Memory Limit : 32768 KB http://acm.fzu.edu.cn/problem.php? ...
- 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]- Nearly Lucky Number(Codeforces Beta Round #84 (Div. 2 Only)A. Nearly)
A. Nearly Lucky Number time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- FZU-2148-Moon Game,,几何计算~~
Problem 2148 Moon Game Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Fat brothe ...
- 【转】关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说你的理解有点片面,那么到底什么 ...