- 浏览: 210726 次
- 性别:
- 来自: 北京
文章分类
如果要将对象组织到树中,使用树来表示对象之间的关系,请考虑使用合成的设计模式。如组织结构,分类分层等等。
既然是要表示成树自然就要定一个树节点的抽象接口,每个元素需要实现该接口。
抽象接口的组成元素,通常抽象接口中包括返回当前节点的方法,获取深度和设置深度的方法。一个提供一个操作逻辑的方法。
实现类在实现抽象接口中的方法基础之上在添加自己所需要的方法。
当然最后遍历的时候需要使用树的递归遍历,添加深度是需要根据深度做区分只节点的处理,如只节点要打印空格等等。
下面掩饰一个实例,实例引用自http://www.admin5.com/article/20080804/97386.shtml
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:13:59
* 抽象文件角色
*/
public interface IFile {
//返回自己的实例
IFile getComposite();
//某个商业方法
void sampleOperation();
//获取深度
int getDeep();
//设置深度
void setDeep(int x);
}
import java.util.Vector;
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:15:03
* 文件夹角色
*/
public class Folder implements IFile {
private String name; //文件名字
private int deep; //层级深度,根深度为0
private Vector<IFile> componentVector = new Vector<IFile>();
public Folder(String name) {
this.name = name;
}
//返回自己的实例
public IFile getComposite() {
return this;
}
//某个商业方法
public void sampleOperation() {
System.out.println("执行了某个商业方法!");
}
//增加一个文件或文件夹
public void add(IFile IFile) {
componentVector.addElement(IFile);
IFile.setDeep(this.deep 1);
}
//删除一个文件或文件夹
public void remove(IFile IFile) {
componentVector.removeElement(IFile);
}
//返回直接子文件(夹)集合
public Vector getAllComponent() {
return componentVector;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDeep() {
return deep;
}
public void setDeep(int deep) {
this.deep = deep;
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:27:15
* 文件
*/
public class File implements IFile {
private String name; //文件名字
private int deep; //层级深度
public File(String name) {
this.name = name;
}
//返回自己的实例
public IFile getComposite() {
return this;
}
//某个商业方法
public void sampleOperation() {
System.out.println("执行了某个商业方法!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDeep() {
return deep;
}
public void setDeep(int deep) {
this.deep = deep;
}
}
import java.util.Iterator;
import java.util.Vector;
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:35:25
* 遍历树的一个测试
*/
public class Client {
public static String indentChar = "\t"; //文件层次缩进字符
public static void main(String args[]) {
new Client().test();
}
/**
* 客户端测试方法
*/
public void test() {
//根下文件及文件夹
Folder root = new Folder("树根");
Folder b1_1 = new Folder("1_枝1");
Folder b1_2 = new Folder("1_枝2");
Folder b1_3 = new Folder("1_枝3");
File l1_1 = new File("1_叶1");
File l1_2 = new File("1_叶2");
File l1_3 = new File("1_叶3");
//b1_2下的文件及文件夹
Folder b2_1 = new Folder("2_枝1");
Folder b2_2 = new Folder("2_枝2");
File l2_1 = new File("2_叶1");
//缔造树的层次关系(简单测试,没有重复添加的控制)
root.add(b1_1);
root.add(b1_2);
root.add(l1_1);
root.add(l1_2);
b1_2.add(b2_1);
b1_2.add(b2_2);
b1_2.add(l2_1);
root.add(l1_3);
root.add(b1_3);
//控制台打印树的层次
outTree(root);
}
public void outTree(Folder folder) {
System.out.println(folder.getName());
iterateTree(folder);
}
/**
* 遍历文件夹,输入文件树
*
* @param folder
*/
public void iterateTree(Folder folder) {
Vector<IFile> clist = folder.getAllComponent();
//todo:遍历之前可以对clist进行排序,这些都不是重点
for (Iterator<IFile> it = clist.iterator(); it.hasNext();) {
IFile em = it.next();
if (em instanceof Folder) {
Folder cm = (Folder) em;
System.out.println(getIndents(em.getDeep()) cm.getName());
iterateTree(cm);
} else {
System.out.println(getIndents(em.getDeep()) ((File) em).getName());
}
}
}
/**
* 文件层次缩进字符串
*
* @param x 缩进字符个数
* @return 缩进字符串
*/
public static String getIndents(int x) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < x; i ) {
sb.append(indentChar);
}
return sb.toString();
}
}
关键部分解释:
这里添加一个元素的时候,会对子元素的深度设置父类的深度+1.然后输出的时候会根据深度值输出对应的空格个数。
注意使用递归输出时要对容器进行判断,这里是文件夹,若是容器可能还会包含子元素,所以要进行下一步的递归。
容器内需要放一个集合,以便用于存放子元素
既然是要表示成树自然就要定一个树节点的抽象接口,每个元素需要实现该接口。
抽象接口的组成元素,通常抽象接口中包括返回当前节点的方法,获取深度和设置深度的方法。一个提供一个操作逻辑的方法。
实现类在实现抽象接口中的方法基础之上在添加自己所需要的方法。
当然最后遍历的时候需要使用树的递归遍历,添加深度是需要根据深度做区分只节点的处理,如只节点要打印空格等等。
下面掩饰一个实例,实例引用自http://www.admin5.com/article/20080804/97386.shtml
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:13:59
* 抽象文件角色
*/
public interface IFile {
//返回自己的实例
IFile getComposite();
//某个商业方法
void sampleOperation();
//获取深度
int getDeep();
//设置深度
void setDeep(int x);
}
import java.util.Vector;
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:15:03
* 文件夹角色
*/
public class Folder implements IFile {
private String name; //文件名字
private int deep; //层级深度,根深度为0
private Vector<IFile> componentVector = new Vector<IFile>();
public Folder(String name) {
this.name = name;
}
//返回自己的实例
public IFile getComposite() {
return this;
}
//某个商业方法
public void sampleOperation() {
System.out.println("执行了某个商业方法!");
}
//增加一个文件或文件夹
public void add(IFile IFile) {
componentVector.addElement(IFile);
IFile.setDeep(this.deep 1);
}
//删除一个文件或文件夹
public void remove(IFile IFile) {
componentVector.removeElement(IFile);
}
//返回直接子文件(夹)集合
public Vector getAllComponent() {
return componentVector;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDeep() {
return deep;
}
public void setDeep(int deep) {
this.deep = deep;
}
}
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:27:15
* 文件
*/
public class File implements IFile {
private String name; //文件名字
private int deep; //层级深度
public File(String name) {
this.name = name;
}
//返回自己的实例
public IFile getComposite() {
return this;
}
//某个商业方法
public void sampleOperation() {
System.out.println("执行了某个商业方法!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDeep() {
return deep;
}
public void setDeep(int deep) {
this.deep = deep;
}
}
import java.util.Iterator;
import java.util.Vector;
/**
* Created by IntelliJ IDEA.
* User: leizhimin
* Date: 2008-8-2 16:35:25
* 遍历树的一个测试
*/
public class Client {
public static String indentChar = "\t"; //文件层次缩进字符
public static void main(String args[]) {
new Client().test();
}
/**
* 客户端测试方法
*/
public void test() {
//根下文件及文件夹
Folder root = new Folder("树根");
Folder b1_1 = new Folder("1_枝1");
Folder b1_2 = new Folder("1_枝2");
Folder b1_3 = new Folder("1_枝3");
File l1_1 = new File("1_叶1");
File l1_2 = new File("1_叶2");
File l1_3 = new File("1_叶3");
//b1_2下的文件及文件夹
Folder b2_1 = new Folder("2_枝1");
Folder b2_2 = new Folder("2_枝2");
File l2_1 = new File("2_叶1");
//缔造树的层次关系(简单测试,没有重复添加的控制)
root.add(b1_1);
root.add(b1_2);
root.add(l1_1);
root.add(l1_2);
b1_2.add(b2_1);
b1_2.add(b2_2);
b1_2.add(l2_1);
root.add(l1_3);
root.add(b1_3);
//控制台打印树的层次
outTree(root);
}
public void outTree(Folder folder) {
System.out.println(folder.getName());
iterateTree(folder);
}
/**
* 遍历文件夹,输入文件树
*
* @param folder
*/
public void iterateTree(Folder folder) {
Vector<IFile> clist = folder.getAllComponent();
//todo:遍历之前可以对clist进行排序,这些都不是重点
for (Iterator<IFile> it = clist.iterator(); it.hasNext();) {
IFile em = it.next();
if (em instanceof Folder) {
Folder cm = (Folder) em;
System.out.println(getIndents(em.getDeep()) cm.getName());
iterateTree(cm);
} else {
System.out.println(getIndents(em.getDeep()) ((File) em).getName());
}
}
}
/**
* 文件层次缩进字符串
*
* @param x 缩进字符个数
* @return 缩进字符串
*/
public static String getIndents(int x) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < x; i ) {
sb.append(indentChar);
}
return sb.toString();
}
}
关键部分解释:
这里添加一个元素的时候,会对子元素的深度设置父类的深度+1.然后输出的时候会根据深度值输出对应的空格个数。
注意使用递归输出时要对容器进行判断,这里是文件夹,若是容器可能还会包含子元素,所以要进行下一步的递归。
容器内需要放一个集合,以便用于存放子元素
发表评论
-
多种单例模式的分析
2012-03-28 18:06 0blog.csdn.net/derpvailzhangfan/ ... -
JDK中的设计模式
2012-03-14 22:56 01.Abstract Factory •java.util.C ... -
简单工厂模式使用心得(使用场景)
2012-02-23 18:24 11474在实际项目中,简单工厂模式是我们使用的最多的设计模式之一,简单 ... -
AbstractList中Iterator模式的妙用
2012-01-13 11:51 932AbstractList中为了实现顺序访问AbstractLi ... -
适合使用命令模式的情景
2012-01-13 11:31 877情景1.当借个类都拥有 ... -
Iterator模式
2012-01-13 10:57 845我个人常叫它游标模式,该模式的主要目的就是,顺序访问集合中的各 ... -
使用工厂设计模式的场景
2012-01-12 15:43 2717创建类对象虽然可以使用new(底层也是通过反射创建对象的),但 ... -
JDK中使用的设计模式
2012-01-13 10:04 14071.抽象工厂模式 实 ... -
JDK中使用的设计模式代码实例
2012-01-05 17:38 0http://stackoverflow.com/questi ... -
享元模式
2011-12-23 10:22 996通常情况下,我们会需 ... -
策略模式
2011-12-22 17:07 830所谓策略模式就是定义了多种算法,而让不同算法之间的切换不会影响 ... -
责任链模式
2011-12-20 18:35 794此文转正于http://wenku.baidu.com/vie ... -
桥梁设计模式
2011-12-19 18:19 797如果有很多对象要处理,而又有很多操作要做。这时可以考虑使用桥梁 ... -
多线程设计模式(Thread-Specific storage)
2011-12-12 15:29 5811引用自http://www.riabook.cn/doc/de ... -
代理模式
2011-11-30 15:26 899代理模式实际上是对对象的一种代理,以控制对象的访问。 有些情况 ... -
观察者模式
2011-11-16 14:48 1361声明转载的,简单易懂,呵呵 观察者模式的构造 l 抽 ... -
命令模式
2011-11-16 14:11 1216今天想学学命令模式,看见了一个文章讲的就是命令模式,感觉实例比 ... -
建造模式
2011-11-14 12:03 876建造模式是将负责对象 ... -
设计模式之适配器模式
2011-11-09 18:24 927适配器模式:主要是为了解决,老的对象在新的环境中不兼容的现象。 ... -
设计模式之模版方法
2011-11-09 16:31 775模版方法是一种非常简单的设计模式:简单的理解就是将关键的业务方 ...
相关推荐
设计模式之合成模式的Java实现版本,包括UML类设计图,包含了两种实现,安全式和透明式
Javajavascript-design-patterns-源代码 用JavaScript语言合成设计模式的源代码
完整的C#设计模式PDF版 C#设计模式(1) 4 一、 C# 面向对象程序设计复习 5 二、 设计模式举例 5 三、 先有鸡还是先有蛋? 7 四、 大瓶子套小瓶子还是小瓶子套大瓶子? 8 五、 .net本质 9 C#设计模式(2) 11 一、 ...
1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...
本书内容覆盖了所有23个经典的“四人小组”设计模式,具体包括:适配器,外观,合成,桥接,单件,观察者,中介者,代理,职责链,享元,生成器,工厂方法,抽象工厂,原型,备忘录,模板方法,状态,策略,命令,...
C#设计模式(1) 一、 C# 面向对象程序设计复习 二、 设计模式举例 三、 先有鸡还是先有蛋? 四、 大瓶子套小瓶子还是小瓶子套大瓶子? 五、 .net本质 C#设计模式(2) 一、 "开放-封闭"原则(OCP) 二、 ...
C++ 23种设计模式(全_解释+源代码).zip 23种设计模式都是基于以下原则,务必记牢 依赖倒转原则 里氏代换原则 开闭原则 接口隔离原则 合成聚合复用原则 迪米特法则 23种设计模式如下:
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元...
本书是一本高级ActionScript 3.0设计模式用书。大家或许也一直没有搞明白“高级”一词的含义。高级ActionScript 3.0指的是本书并不包含API引用函数以及ActionScript 3.0的入门基础这些主题。作者假定读者已经具备...
软件设计模式概述 2GoF 的 23 种设计模式 3UML中的类图及类图之间的关系 4开闭原则 5里氏替换原则 6依赖倒置原则 7单一职责原则 8接口隔离原则 9迪米特法则 10合成复用原则 11创建型模式的特点和分类 12单例模式 13...
详细描述全部(23种)设计模式与设计原则(6种)。 (一)设计原则包括: 1、开闭原则 2、里氏代换原则 3、依赖转换原则 4、接口隔离原则 5、合成/聚合复用原则 6、最少知识原则 (二)设计模式 1)工厂模式...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰...
合成模式就 合成模式 是一个处理对象的树结构的模式。 合成模式把部分与整体的关系用树结构表示出来。 合成模 式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 9、DECORATOR — Mary 过...
java 设计模式与Jar库 里氏代换原则LSP 依赖倒转原则DIP 接口隔离原则ISP 合成/聚合复用原则CARP
计算机后端-Java-图解java设计模式022 合成复用.avi
3.1.1设计模式 3.1.2创建型模式概述 3.1.3简单工厂模式 3.1.4工厂方法模式 3.1.5抽象工厂模式 3.1.6建造者模式 3.1.7原型模式 3.1.8单例模式 3.2实训实例 3.2.1简单工厂模式实例之图形工厂 3.2.2工厂方法...
设计模式的个人总结教材,适合IT专业人士研究,目录如下: 序言 概念 6 1.1 设计模式的定义 6 1.2 设计模式的作用 6 1.3 设计模式的由来 6 1.4 设计模式的分类 7 1.5 OO设计七原则 7 1.5.1 开-闭原则(OPEN-CLOSED ...
本书是一本高级ActionScript 3.0设计模式用书。大家或许也一直没有搞明白“高级”一词的含义。高级ActionScript 3.0指的是本书并不包含API引用函数以及ActionScript 3.0的入门基础这些主题。作者假定读者已经具备...