组合模式(composite)

组合模式的使用场景:

  把部分和整体的关系用树型结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。 

组合模式的核心:   

  抽象构件(Component)角色:定义了叶子和容器的共同点; 
  叶子(Leaf)构件角色:无子节点; 
  容器(Composite)构件角色:有容器特征,可以包含子节点;

  

  下面用代码来说明: 
  创建各种抽象组件:

  

package com.note.pattern.composite;

/**
 * 抽象组件
 */
public interface Component {
	void operation();
}


/**
 * 叶子组件
 */
interface Leaf extends Component{
}


/**
 * 容器组件
 */
interface Composite extends Component{
void add(Component c); void remove(Component c); Component getChild(int index); }

  

组合模式工作流程分析: 

  组合模式为处理树型结构提供了完美解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子; 
  当容器对象的指定方法被调用时,将遍历整个树型结构,寻找也包含这个方法的成员,并调用执行。其中,使用了递归调用的机制对整个结构进行处理;

  下面在模拟杀毒软件架构设计的代码中使用组合模式:

  

package com.note.pattern.composite;

import java.util.ArrayList;
import java.util.List;

public interface AbstractFile {

	void killVirus();// 杀毒

}

class ImageFile implements AbstractFile {

	private String name;

	public ImageFile(String name) {
		this.name = name;
	}

	@Override
	public void killVirus() {
		System.out.println("---图像文件:" + name + ",进行查杀!");
	}

}

class TextFile implements AbstractFile {

	private String name;

	public TextFile(String name) {
		super();
		this.name = name;
	}

	@Override
	public void killVirus() {
		System.out.println("---文本文件:" + name + ",进行查杀!");
	}
}

class VideoFile implements AbstractFile {

	private String name;

	public VideoFile(String name) {
		super();
		this.name = name;
	}

	@Override
	public void killVirus() {
		System.out.println("---视频文件:" + name + ",进行查杀!");
	}
}

class Folder implements AbstractFile {

	private String name;
	// 定义容器,用来存放本容器构建下的子节点
	private List<AbstractFile> list = new ArrayList<AbstractFile>();

	public Folder(String name) {
		this.name = name;
	}

	public void add(AbstractFile file) {
		list.add(file);
	}

	public void remove(AbstractFile file) {
		list.remove(file);
	}

	public AbstractFile getChild(int index) {
		return list.get(index);
	}

	@Override
	public void killVirus() {
		
		System.out.println("---文件夹:" + name + ",进行查杀");

		for (AbstractFile file : list) {
			file.killVirus();
		}
	}

}

  

package com.note.pattern.composite;

public class Client {

	public static void main(String[] args) {
		
		Folder folder = new Folder("我的目录");
		folder.add(new ImageFile("图片目录"));
		folder.add(new TextFile("文件"));
		folder.killVirus();
		
	}

}

  

组合模式在开发中的应用场景: 

  操作系统的资源管理器; 
  GUI中的容器层次图; 
  XML文件解析; 
  OA系统中组织结构的管理; 
  Junit单元测试框架;

posted @ 2018-01-09 16:03  jianhuazhao  阅读(246)  评论(0编辑  收藏  举报