`

合成设计模式

阅读更多
如果要将对象组织到树中,使用树来表示对象之间的关系,请考虑使用合成的设计模式。如组织结构,分类分层等等。
既然是要表示成树自然就要定一个树节点的抽象接口,每个元素需要实现该接口。
抽象接口的组成元素,通常抽象接口中包括返回当前节点的方法,获取深度和设置深度的方法。一个提供一个操作逻辑的方法。
实现类在实现抽象接口中的方法基础之上在添加自己所需要的方法。
当然最后遍历的时候需要使用树的递归遍历,添加深度是需要根据深度做区分只节点的处理,如只节点要打印空格等等。
下面掩饰一个实例,实例引用自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.然后输出的时候会根据深度值输出对应的空格个数。
注意使用递归输出时要对容器进行判断,这里是文件夹,若是容器可能还会包含子元素,所以要进行下一步的递归。
容器内需要放一个集合,以便用于存放子元素
分享到:
评论

相关推荐

    设计模式之合成模式Java实现和类设计图

    合成模式(Composite Pattern)是软件工程中的一种设计模式,它属于结构型模式,主要用于处理对象的组合。在合成模式中,我们能够将简单对象和组合对象以统一的方式进行操作,这样用户就可以忽略对象的复杂性,而...

    软件设计模式(java版)习题答案.pdf

    软件设计模式(Java版)习题答案 本资源为软件设计模式(Java版)习题答案,由程细柱编著,人民邮电出版社出版。该资源涵盖了软件设计模式的基础知识,包括软件设计模式的概述、UML中的类图、面向对象的设计原则、...

    浅析23种软件设计模式

    浅析23种软件设计模式 软件设计模式是软件开发中的一种解决方案,旨在解决软件设计中的各种问题。下面我们将对23种常见的软件设计模式进行浅析。 1. 工厂模式:工厂模式的主要思想是将客户类和工厂类分开,客户类...

    java 设计模式试题

    题目中的第一个选项“同一问题的不同表现形式”(A) 描述了设计模式的主要应用场景之一。设计模式帮助开发者处理常见的软件设计难题,确保代码的可读性、可维护性和可扩展性。 ### 2. 面向对象的基本原则 面向对象...

    java源码设计模式-javascript-design-patterns-source-code:用JavaScript语言合成设计模式的源

    在软件开发领域,设计模式是一种经过验证的有效解决常见问题的方法,它们是经验丰富的开发者们在实践中总结出的最佳实践。在Java和JavaScript这两种广泛使用的编程语言中,设计模式的应用尤为重要。本压缩包“java-...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    韩顺平_Java设计模式笔记.docx

    设计模式的七大原则是软件设计中普遍存在的问题的解决方案,包括单一职责原则、接口隔离原则、依赖倒转原则、里式替换原则、开闭原则、迪米特法则和合成复用原则等。这些原则旨在让软件具有更好的复用性、扩展性、...

    Java设计模式面试题汇总

    Java设计模式面试题汇总 本文将对Java设计模式面试题进行总结,涵盖软件设计原则、设计模式的定义、分类、常见模式等内容。 软件设计原则: 软件设计原则是指在软件设计中需要遵守的一些规则和原则,这些原则可以...

    尚硅谷设计模式源码笔记课件.zip

    1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种...

    java设计模式(刘伟)

    ### Java设计模式(刘伟) #### 一、引言 在《Java设计模式》这本书中,作者刘伟全面地介绍了24种经典的设计模式,并通过丰富的案例和代码示例进行了详细的解析。本书不仅适合初学者作为入门教材,也适合有一定...

    C#设计模式.PDF

    根据提供的文档概览,我们可以对每个章节所涉及的设计模式进行详细的阐述和解释。下面将针对文档中提及的设计模式逐一展开,以便更好地理解这些模式的概念、结构、应用场景以及优缺点。 ### 1. 面向对象程序设计...

    设计模式C#版

    设计模式是在软件工程领域内针对软件设计中反复出现的问题的通用解决方案。它是一套被反复使用的、多数人知晓的、经过分类编目、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证...

    韩顺平_java设计模式笔记

    Java设计模式是软件开发中的一种最佳实践,它们是为了解决特定场景下的设计问题而发展起来的。23种设计模式被广泛应用于提高代码的可重用性、可读性、可维护性和灵活性。韩顺平老师的Java设计模式课程通过生活中的...

    设计模式相关资料

    1. **设计原则**:设计模式的基础是面向对象设计的七大原则,包括单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)、迪米特法则(LoD)和合成复用原则。...

    Java设计模式学习.pdf

    Java设计模式是软件开发中一种被广泛采用的方式,它是一组被反复使用、多数人知晓、分类编目、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 根据提供的文件内容,...

    java软件设计模式期末总结

    Java软件设计模式是软件开发中的重要概念,它们是经过时间考验的最佳实践,旨在解决常见的设计问题,提高代码的可读性、可维护性和可扩展性。以下是对标题和描述中涉及的一些关键知识点的详细说明: 1. **单一职责...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象...

Global site tag (gtag.js) - Google Analytics