设为首页 加入收藏

TOP

OO模式-Composite(一)
2015-07-20 17:29:22 来源: 作者: 【 】 浏览:7
Tags:模式 -Composite

组合模式也叫做“部分-整体”模式,这样其实定义也就很明显了,正好和数据结构的知识相对应,把对象组合成树形结构以表示“部分-整体”的层次结构。

先看类图:

\

首先分析一下这个类图,Leaf和CompZ??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc2l0ZcrHzayxsrXEo6y2vMrHvMyz0Li4wOBDb21wb25lbnSjrNPW0vLOqkNvbXBvbmVudNbQtObU2kxlYWbX08Dgo6zL+dLUy/u6zUNvbXBvbmVudLu5tObU2tfFvtu6z7nYz7U8L3A+CjxwPjxicj4KPC9wPgo8cD4gICAgIL7Z0ru49rrcs6O8+7XEwP3X06OsztLDx8zszOy21NfFtefE1KOsus2499bWzsS8/qOszsS8/rzQtPK9u7XAo6zV4rK7vs3Kx9K7uPa63LrDtdjX6brPxKPKvcLwo788L3A+CjxwPjxzdHJvbmc+wLS/tL+0wODNvKO6PC9zdHJvbmc+PC9wPgo8cD48aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/49/1_iyppw__.png" alt="\">

来看看具体的实现代码:

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
  
    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
  
    getChildren() {
		return null;
	}
}
  
Folder为子类文件夹,同样也继承于父类,但是此类只是一个普通的节点,里边依旧包含叶子节点。

package composite;

import java.util.*;

public class Folder extends AbstractFile {
	
	private List
  
    childList ;

	public Folder(String name) {
		this.name = name;
		//用来建立一个集合保存子文件
		this.childList = new ArrayList
   
    (); } //添加子文件 public boolean addChild(AbstractFile file) { return childList.add(file); } //删除子文件 public boolean removeChild(AbstractFile file) { return childList.remove(file); } // 子类的返回类型应该和父类的定义保持一致 public List
    
      getChildren() { return childList; } } 
    
   
  
最后来看看客户端是如何调用和打印的

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
  
    children = ifile.getChildren();
		if (children == null)
			return;
		for (AbstractFile file : children) {
			printTree(file); // 打印方法的调用
		}
	}
}
  

透明方式与安全方式

在File子类中,他所谓的各种方法都是不实行的,但是却依旧存在,这种方式就叫做“透明方式”;这样做的好处就是叶子节点和枝节点对于外界没有区别,它们具备完全一致的行为接口;但是问题也会很明显的,那就是在File中那些所谓的方法的存在是毫无意义的;

如果不想让其做无用功,也就是把File子类中的无意义的方法都去掉,这种方式叫做“安全方式”;但是由于是不透明的,所以他们就不能具有一致的接口了,这样反而增加了其复杂性,客户端的调用需要再增加其相应的判断。


什么时候使用组合模式?

1)需求中体现的是“部分-整体”的层次的结构时,使用此模式;

2)用户希望忽略组合对象与单个对象的不同,统一地使用组合结构中的所有的

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇zoj 3822 Domination 下一篇POJ2456 Aggressive cows(二分+贪..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)