设计模式6:Composite
Entry.java:
package gendwang.cisco.com; public abstract class Entry
{
private int height = 0;
private String name;
private Type type; public Entry(String name)
{
this.name = name;
} public int getHeight() {
return height;
} public void setHeight(int height) {
this.height = height;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Type getType() {
return type;
} public void setType(Type type) {
this.type = type;
} public abstract void print();
}
File.java:
package gendwang.cisco.com; public class File extends Entry
{
public File(String name)
{
super(name);
setType(Type.File);
} public void print()
{
int numOfWhiteSpace = getHeight() * 2;
for(int i = 0; i < numOfWhiteSpace; i++)
{
System.out.print(" ");
} System.out.println(getName());
}
}
Directory.java:
package gendwang.cisco.com; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; public class Directory extends Entry
{
private List<Entry> list = new LinkedList<Entry>(); public Directory(String name)
{
super(name);
setType(Type.Directory);
} public void addEntry(Entry entry)
{
int myHeight = getHeight();
incrementHeight(entry, myHeight + 1); list.add(entry);
} public List<Entry> getChilden()
{
return list;
} public void print()
{
int numOfWhiteSpace = getHeight() * 2;
for(int i = 0; i < numOfWhiteSpace; i++)
{
System.out.print(" ");
}
System.out.println(getName()); Iterator<Entry> itor = list.iterator();
while(itor.hasNext())
{
Entry entry = itor.next();
entry.print();
}
} private void incrementHeight(Entry entry, int added)
{
int height = entry.getHeight();
entry.setHeight(height + added); if(entry.getType() == Type.Directory)
{
Directory dir = (Directory)entry;
List<Entry> list = dir.getChilden();
Iterator<Entry> itor = list.iterator();
while(itor.hasNext())
{
Entry tmp = itor.next();
incrementHeight(tmp, added);
}
}
}
}
Type.java:
package gendwang.cisco.com; public enum Type
{
File,
Directory
}
Test.java:
package gendwang.cisco.com; public class Test
{
public static void main(String[] args)
{
Directory dir1 = new Directory("tmp");
Entry file1 = new File("hello.jpg");
Entry file2 = new File("install.log");
dir1.addEntry(file1);
dir1.addEntry(file2); Directory dir2 = new Directory("system"); Directory dir3 = new Directory("windows");
dir3.addEntry(dir1);
dir3.addEntry(dir2); Directory dir4 = new Directory("root");
Entry file3 = new File("password");
dir4.addEntry(file3);
dir4.addEntry(dir3); dir4.print();
}
}
设计模式6:Composite的更多相关文章
- [学习笔记]设计模式之Composite
为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 在Composite(组合)模式中,用户可以使用多个简单的组件以形成较大的组件,而这些组件还可能进一步组合成更大的.它重要的特性是能够 ...
- 设计模式之Composite(组合)(转)
Composite定义: 将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Comp ...
- 设计模式之Composite
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) Composite定义? 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构. 想到Compo ...
- 【设计模式】Composite
目录 前言 安卓View的实现 View Beyond setContentView setContentView做了什么事情? 如何将xml文件变成对象的? 小结 View的绘制流程 三个流程 三个 ...
- 设计模式之Composite(组合)模式
1.出现原因 1.在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即它们在充当对象的同时,又是其他对象的容器. 如何将“客户代码与复杂的对象容器结构”解耦(将这种组合容器对象设计成树形结构 ...
- 设计模式之Composite模式(笔记)
组合模式:将对象组合成树形结构以表示"部分-总体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 适用场合:当需求中是体现部分与总体层次的结构时,以及希望用户 ...
- 设计模式(9)--Composite(组合模式)--结构型
1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...
- 设计模式之——Composite模式
composite模式又叫做组合模式/复合模式. 它是一种能够使容器与内容具有一致性,创造出递归结构的模式. 示例程序是列出文件夹以及其内部文件与文件夹一览的功能: 可以由示例图看出,有一个电影文件夹 ...
- 设计模式之——Composite组合模式
上周面试,面试官问桥接模式是什么,我就举了个例子:手机分为苹果,小米....,每个手机都有视频,游戏...等功能.直观上是一个树形结构.这种情况下,可以用桥接模式,把手机作为接口,苹果,小米等继承手机 ...
- 设计模式:composite模式
目的:使容器和内容具备一致性 实现:将对象组合成树形结构以表示“部分-整体”的层次结构 实例:文件夹中可以包含文件夹也可以包含文件 例子: class Item //接口定义 { public: vi ...
随机推荐
- BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果( dp )
dp dp( x , k ) = max( dp( x - 1 , k - 1 ) + *** , dp( x - 1 , k ) + *** ) *** = 0 or 1 ,根据情况 (BZOJ 1 ...
- ThinkPHP文件上传类
TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...
- Cin、Cout 加快效率方法
std::ios::sync_with_stdio(false); 在main 函数中加上这么一句话. 可以打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无 ...
- Qt如何读取ico文件中的image(使用QImageReader和QIcon)
ico文件是一个容器,内部可以装载许多个image,我们可以通过QIcon的pixmap方法来获取需要的image QPixmap pixmap ( const QSize & size, M ...
- 字符串如何判断null.
转http://blog.sina.com.cn/s/blog_48cd37140101awgq.html Java中判断String不为空的问题 一.判断一个字符串str不为空的方法有: 1. st ...
- Python 2.7 学习笔记 基本语法和函数定义
本文介绍下python的基本语法 一.变量定义 不需要说明类型,也不需要像js等脚本语言使用var等标识符.直接声明即可,如: num=1 说明:上面语句声明了一个变量num,并在声明时初始化值为 1 ...
- Jquery的text()和html()方法在li与div取值结果解析
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- OGG同构(ORACLE-ORACLE)、异构(ORACLE-MYSQL)同步配置及错误解析
环境:11.2.0.3(已安装数据库实例)+OEL5.7 192.168.1.55 zlm sid:zlm11g 192.168.1.60 zlm2 sid:zlm11g 一.安装软件,配置环境,创建 ...
- 设计模式(四)原型模式Prototype(创建型)
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...
- block 解析 - 静态变量
静态变量 上一篇 我们了解了block全局变量的使用,静态变量和全局变量一样,可以直接在block内部使用,也可以在block内部修改 引用官方文档: Global variables are acc ...