JAVA设计模式(10):结构型-组合模式(Composite)

先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

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

}
/**
 * 容器组件
 */
interface Composite extends  Component{

}
public interface AbstractFile {
	void killVirus();
}
class ImageFile implements AbstractFile{
	private String name;

	public ImageFile(String name) {
		super();
		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) {
		super();
		this.name = name;
	}

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

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

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

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

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

测试:

public class Client {

	public static void main(String[] args) {
		AbstractFile f2,f3,f4,f5;
		Folder f1 = new Folder("我的收藏");
		f2 = new ImageFile("mm.jpg");
		f3 = new TextFile("123.txt");
		f1.add(f2);
		f1.add(f3);

		Folder f11 = new Folder("我的电影");
		f4 = new VideoFile("笑傲江湖.avi");
		f5 = new VideoFile("神雕侠侣.mp4");
		f11.add(f4);
		f11.add(f5);

		f1.add(f11);

		f1.killVirus();
	}

}

什么情况下使用组合模式

引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”

时间: 2024-10-31 00:08:08

JAVA设计模式(10):结构型-组合模式(Composite)的相关文章

设计模式(七)组合模式Composite(结构型)

设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何

一起学java设计模式--适配器模式(结构型模式)

适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法.现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中.绘制类图并编程实现. (要求实现

Java设计模式之结构型模式

结构型设计模式是从程序的结构上解决模块之间的耦合问题.包括以下七种模式: 适配器模式:可以将类的一个借口匹配另一个接口 组合模式:对象的组合 代理模式:一个简单的对象代替一个复杂的稍后会被调用的复杂对象 外观模式:一个类表示一个子系统 享元模式:用于共享对象,其中每个实例都不保存自己的状态.而是将状态保存在外部 桥接模式:将对象的接口与实现分离 装饰模式:动态给对象添加职责结构型设计模式是从程序的结构上解决模块之间的耦合问题 适配器模式: 原文链接:一个示例让你明白适配器模式 含义:将一个类的接

设计模式-结构型-组合模式

组合模式(Composite): 定义: 组合模式又叫部分整体模式,它是一种将对象组合成树状的层次结构模式,用来表示"部分-整体"的关系,使用户对单个对象和组合对象具有一致的访问性. 组合模式的角色: 1)抽象构建(Component):它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为.在透明式的组合模式中抽象构件还声明访问和管理子类的接口:在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成. 2)树叶构件(Leaf):是组合中的叶节点对象,它没

设计模式(二)组合模式Composite(表达式求值)

组合模式目标:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性. 透露一下:这个例子可以说是组合模式的典型应用,据说(作者说)某个编译器开发团队用了两个半月的时间实现了表达式求值,被作者用十几行代码就这样实现了. 需求:表达式求值,是编译器的重要组件,本例你能找到的实际代码应该不多,因为是本人根据<C++沉思录>里面的例子亲自敲出来的(当然都是作者的功劳).目的在于支持各种一元运算,二元运算甚至更多的运算都加入到表达式求值中,程序方便扩展

设计模式(八)组合模式 Composite

组合模式: 允许你将对象组合成树形结构来表现“整体/部分”层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 组合模式适用于创建复杂的对象,这个对象包含某些个别的对象以及这些对象的组合. 从操作的角度而言,客户端对于 个别对象/组合 的操作是一致的. 模拟场景 如图所示,总公司下属有多个部门,而子公司可以视为多个部门的组合. 整个数据结构呈树状,完美契合组合模式的应用场景. UML: 在这个场景中: 个别对象 -> 人事部(HRDepartment)和财务部(FinanceDepart

设计模式之结构型--代理模式

代理模式(Proxy pattern)核心作用: 通过代理,控制对对象的访问 可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后 做后置处理(即:AOP的微观实现) ----AOP(Aspect Oriented Programming面向切面编程)的核心实现机制 --核心角色: 抽象角色: 定义代理角色和真实角色的公共对外方法,(一个接口,真实角色和代理角色都要去实现这个接口) 真实角色 实现抽象角色,定义真实角色所要实现的业务逻辑供代理角色调用 代理角色 实现

Headfirst设计模式的C++实现——组合模式(Composite)

menu_component.h 1 #ifndef _MENU_COMPONENT_H_ 2 #define _MENU_COMPONENT_H_ 3 4 #include <string> 5 6 class MenuComponent { 7 public: 8 class Iterator { 9 public: 10 virtual bool has_next() = 0; 11 12 virtual MenuComponent *next() = 0; 13 }; 14 15 Me

设计模式之结构型桥接模式

在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦. function changeColor(dom, color, bg) { // 设置元素的字体颜色 dom.style.color = color; // 设置元素的背景颜色 dom.style.background = bg; } var spans = document.getElementsByTagName('span'); spans[0].onmouseover = function() { changeColor(t