设计模式 - 组合模式

一. 简述

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

属于结构型模式

二. 组成

  • Component类:组合中的对象声明接口,在适当情况下,实现所有类共有接口的行为。声明一个接口用于访问和管理Component的子部件。

  • Leaf类:叶节点对象。
  • Composite类:实现Componet的相关操作,比如Add和Remove操作。

三. UML类图


四. 基本代码

public abstract class Company {
	private String name;
	public Company(String name) {
		super();
		this.name = name;
	}
	public Company(){}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	protected abstract void add(Company company);
	protected abstract void romove(Company company);
	protected abstract void display(int depth);
}

// 枝结点类:
public class ConcreteCompany extends Company {
	private List cList;
	public ConcreteCompany() {
		cList = new ArrayList();
	} 
	
	public ConcreteCompany(String name) {
		super(name);
		cList = new ArrayList();
	} 
	
	@Override
	protected void add(Company company) {
			cList.add(company);
	}
	
	@Override
	protected void romove(Company company) {
		cList.remove(company);
	}
	
	@Override
	protected void display(int depth) {
		StringBuilder sb = new StringBuilder("");
		for (int i = 0; i < depth; i++) {
			sb.append("-");
		}
		System.out.println(new String(sb) + this.getName());
		for (Company c : cList) {
			c.display(depth + 2);
		}
	}
}

// 两个叶结点类:
// 叶节点1
public class HRDepartment extends Company {
	public HRDepartment(String name) {
		super(name);
	}
	
	@Override
	protected void add(Company company) {}
	
	@Override
	protected void romove(Company company) {}
	
	@Override
	protected void display(int depth) {
		StringBuilder sb = new StringBuilder("");
		for (int i = 0; i < depth; i++) {
			sb.append("-");
		}
		System.out.println(new String(sb) + this.getName());
	}
}

//叶节点2
public class FinanceDepartment extends Company {
	public FinanceDepartment(String name) {
		super(name);
	}
	
	@Override
	protected void add(Company company) {}
	
	@Override
	protected void romove(Company company) {}
	
	@Override
	protected void display(int depth) {
		StringBuilder sb = new StringBuilder("");
		for (int i = 0; i < depth; i++) {
			sb.append("-");
		}
		System.out.println(new String(sb) + this.getName());
	}
}

// 客户端:
public class Client {
	public static void main(String[] args) {
		Company root = new ConcreteCompany();
		root.setName("北京总公司");
		root.add(new HRDepartment("总公司人力资源部"));
		root.add(new FinanceDepartment("总公司财务部"));
		Company shandongCom = new ConcreteCompany("山东分公司");
		shandongCom.add(new HRDepartment("山东分公司人力资源部"));
		shandongCom.add(new FinanceDepartment("山东分公司账务部"));
		Company zaozhuangCom = new ConcreteCompany("枣庄办事处");
		zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));
		zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));
		Company jinanCom = new ConcreteCompany("济南办事处");
		jinanCom.add(new FinanceDepartment("济南办事处财务部"));
		jinanCom.add(new HRDepartment("济南办事处人力资源部"));
		shandongCom.add(jinanCom);
		shandongCom.add(zaozhuangCom);
		root.add(shandongCom);
		root.display(0);
	}
}

五. 优缺点

优点:

  1. 组合模式可以很容易的增加新的构件。

  2. 使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。

缺点:

  1. 使用组合模式后,控制树枝构件的类型不太容易。

  2. 用继承的方法来增加新的行为很困难。

六. 应用场景

  1. 想表示对象的部分-整体层次结构。
  2. 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值