Composite模式

本文介绍了一种常用的设计模式——组合模式,通过将对象组织成树形结构来表示部分-整体的层次关系,使得用户可以一致地操作单个对象和组合对象。文中提供了一个具体的例子,包括抽象基类Company及其实现ConcreteCompany、DepartmentA、DepartmentB和DepartmentC等,展示了如何构建一个组织结构,并通过Test类进行了演示。

将对象组合成树形结构以表示 部分-整体 的层次结构,使用户对单个对象和组合对象的使用具有一致性
适用场合:忽略组合对象与单个对象的不同,统一使用组合结构中的所有对象

 

Company.java

package com.gary.designpattern.composite;

/**
 * 公司类
 * @author gary
 *
 */
public abstract class Company {
	protected String name;

	public Company(){
	}
	
	public Company(String name) {
		this.name = name;
	}
	
	public void printName(){
		System.out.println(name);
	}
	
	//增
	public abstract void add(Company company);
	//删
	public abstract void delete(Company company);
	//查
	public abstract void show(int depth);
	
}

 

ConcreteCompany.java

package com.gary.designpattern.composite;

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

/**
 * 存储子节点
 * @author gary
 *
 */
public class ConcreteCompany extends Company {
	
	private List<Company> children = new ArrayList<Company>();

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

	@Override
	public void add(Company company) {
		children.add(company);
	}

	@Override
	public void delete(Company company) {
		children.remove(company);
	}

	@Override
	public void show(int depth) {
		for (int i = 0; i < depth; i++) {
			System.out.print("-");
		}
		printName();
		
		for (int i = 0; i < children.size(); i++) {
			children.get(i).show(depth + 1);
		}
	}

}

 

DepartmentA.java

package com.gary.designpattern.composite;

/**
 * 部门A
 * @author gary
 *
 */
public class DepartmentA extends Company {

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

	/**
	 * 叶子节点无子节点
	 */
	@Override
	public void add(Company company) {
	}

	/**
	 * 叶子节点无子节点
	 */
	@Override
	public void delete(Company company) {
	}

	@Override
	public void show(int depth) {
		for (int i = 0; i < depth; i++) {
			System.out.print("-");
		}
		printName();
	}
	
	public void functionA(){
		System.out.println("function A");
	}

}

 

DepartmentB.java

package com.gary.designpattern.composite;

/**
 * 部门B
 * @author gary
 *
 */
public class DepartmentB extends Company {

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

	/**
	 * 叶子节点无子节点
	 */
	@Override
	public void add(Company company) {
	}

	/**
	 * 叶子节点无子节点
	 */
	@Override
	public void delete(Company company) {
	}

	@Override
	public void show(int depth) {
		for (int i = 0; i < depth; i++) {
			System.out.print("-");
		}
		printName();
	}
	
	public void functionB(){
		System.out.println("function B");
	}
}

 

DepartmentC.java

package com.gary.designpattern.composite;

/**
 * 部门C
 * @author gary
 *
 */
public class DepartmentC extends Company {

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

	/**
	 * 叶子节点无子节点
	 */
	@Override
	public void add(Company company) {
	}

	/**
	 * 叶子节点无子节点
	 */
	@Override
	public void delete(Company company) {
	}

	@Override
	public void show(int depth) {
		for (int i = 0; i < depth; i++) {
			System.out.print("-");
		}
		printName();
	}

	public void functionC(){
		System.out.println("function C");
	}
}

 

Test.java

package com.gary.designpattern.composite;

/**
 * 测试
 * @author gary
 *
 */
public class Test {
	public static void main(String[] args) {
		ConcreteCompany root = new ConcreteCompany("总公司");

		ConcreteCompany company1 = new ConcreteCompany("分公司1");
		company1.add(new DepartmentA("分公司1部门1"));
		company1.add(new DepartmentB("分公司1部门2"));
		company1.add(new DepartmentC("分公司1部门3"));
		
		ConcreteCompany company2 = new ConcreteCompany("分公司2");
		company2.add(new DepartmentA("分公司2部门1"));
		company2.add(new DepartmentB("分公司2部门2"));

		ConcreteCompany company3 = new ConcreteCompany("分公司3");
		company3.add(new DepartmentA("分公司3部门1"));
		
		root.add(company1);
		root.add(company2);
		root.add(company3);

		root.show(1);
	}
}

 

### Composite模式经典应用案例与示例代码 #### 经典应用案例 Composite模式(组合模式)是一种结构型设计模式,用于将对象组织成树形结构以表示“部分-整体”的层次关系。它使得用户可以对单个对象和组合对象进行统一处理,从而简化了客户端代码的设计[^4]。 在实际开发中,Composite模式常被应用于需要管理复杂层级结构的场景,例如文件系统、图形界面组件管理、组织架构管理等。 以下是一个典型的Composite模式应用场景:**文件系统**。在文件系统中,文件夹(目录)可以包含子文件夹或文件,而文件是不可再分的基本单元。通过Composite模式,可以将文件夹和文件统一处理为“节点”,从而简化操作逻辑。 --- #### 示例代码:文件系统中的Composite模式实现 以下是使用Java语言实现的Composite模式示例代码,展示了如何通过该模式管理文件系统中的文件和文件夹: ```java // 抽象组件类 interface FileSystemComponent { void display(String indent); } // 叶子节点:文件 class File implements FileSystemComponent { private String name; public File(String name) { this.name = name; } @Override public void display(String indent) { System.out.println(indent + "File: " + name); } } // 容器节点:文件夹 class Folder implements FileSystemComponent { private String name; private List<FileSystemComponent> components = new ArrayList<>(); public Folder(String name) { this.name = name; } public void addComponent(FileSystemComponent component) { components.add(component); } @Override public void display(String indent) { System.out.println(indent + "Folder: " + name); for (FileSystemComponent component : components) { component.display(indent + " "); // 增加缩进以显示层级关系 } } } // 测试类 public class CompositePatternDemo { public static void main(String[] args) { // 创建文件和文件夹 File file1 = new File("file1.txt"); File file2 = new File("file2.txt"); File file3 = new File("file3.txt"); Folder folder1 = new Folder("folder1"); Folder folder2 = new Folder("folder2"); // 将文件和文件夹添加到容器中 folder1.addComponent(file1); folder1.addComponent(file2); folder2.addComponent(file3); folder2.addComponent(folder1); // 显示文件系统结构 folder2.display(""); } } ``` --- #### 运行结果 运行上述代码后,输出结果如下: ``` Folder: folder2 File: file3.txt Folder: folder1 File: file1.txt File: file2.txt ``` --- #### Composite模式的应用场景 1. **文件系统管理**:如上例所示,文件和文件夹可以被统一处理为“节点”。 2. **图形界面组件**:在GUI设计中,窗口、面板、按钮等都可以被视为组件,支持递归嵌套。 3. **组织架构管理**:将公司部门和员工视为节点,支持多层次管理。 4. **游戏开发**:在游戏场景中,角色、道具、技能等可以组成复杂的树形结构。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值