设计模式学习笔记10 - Java版之组合模式

1. 需求: 学校院系展示

在一个页面中展示学校院系的组成. 学校有多个院系, 每个院系有多个专业…

2. 传统的方案

在这里插入图片描述

  1. 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的
  2. 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的管理的操作,比如对学院、系的添加,删除,遍历等
  3. 解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。 => 组合模式

3. 组合模式

3.1 基本介绍

  1. 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系
  2. 组合模式依据树形结构来组合对象,用来表示部分以及整体层次
  3. 这种类型的设计模式属于结构型模式
  4. 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象

在这里插入图片描述
在这里插入图片描述

3.2 解决问题

组合模式解决这样的问题,当我们的要处理的对象可以生成一颗树形结构,而我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子

3.3 解决学校院系展示问题

在这里插入图片描述

package com.liyang;

// 1. 大学 院系 专业我们认为都是组织, 因此我们为这些组织抽象出来一个类
public abstract class OrganizationComponent {
	private String name; // 组织名称
	private String desc; // 组织描述

	// 添加子组织, 这里因为专业没有子组织不需要重写这个方法,因此这里这个方法不做成抽象的
	public void add(OrganizationComponent organizationComponent) {
		// 默认实现
		throw new UnsupportedOperationException();
	}

	// 删除子组织
	public void delete(OrganizationComponent organizationComponent) {
		// 默认实现
		throw new UnsupportedOperationException();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	public OrganizationComponent(String name, String desc) {
		super();
		this.name = name;
		this.desc = desc;
	}

	// 打印组织的信息
	public abstract void print();

}
package com.liyang;

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

// 2. 大学 泛化 OrganizationComponent
public class University extends OrganizationComponent {
	// 用来存储子组织
	List<OrganizationComponent> organizationComponent = new ArrayList<OrganizationComponent>();

	// 构造器
	public University(String name, String desc) {
		super(name, desc);
	}

	@Override
	public void add(OrganizationComponent organizationComponent) {
		this.organizationComponent.add(organizationComponent);
	}

	@Override
	public void delete(OrganizationComponent organizationComponent) {
		this.organizationComponent.remove(organizationComponent);
	}

	@Override
	public void print() {
		System.out.println("======="+ getName() +"======");
		for (OrganizationComponent organizationComponent2 : organizationComponent) {
			organizationComponent2.print();
		}
	}

}
package com.liyang;

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

// 3. 院系 同理大学
public class College extends OrganizationComponent {
	// 用来存储子组织
	List<OrganizationComponent> organizationComponent = new ArrayList<OrganizationComponent>();

	public College(String name, String desc) {
		super(name, desc);
	}

	@Override
	public void add(OrganizationComponent organizationComponent) {
		this.organizationComponent.add(organizationComponent);
	}

	@Override
	public void delete(OrganizationComponent organizationComponent) {
		this.organizationComponent.remove(organizationComponent);
	}

	@Override
	public void print() {
		System.out.println("======="+ getName() +"======");
		for (OrganizationComponent organizationComponent2 : organizationComponent) {
			organizationComponent2.print();
		}
	}
	
}
package com.liyang;

// 4. 专业
public class Department extends OrganizationComponent {

	public Department(String name, String desc) {
		super(name, desc);
	}

	@Override
	public void print() {
		System.out.println("======="+ getName() +"======");
	}
}
package com.liyang;

// 5. 测试
public class Client {

	public static void main(String[] args) {
		// 创建大学
		University university = new University("清华", "中国顶级大学");
		
		// 创建学院
		College computer = new College("计算机", "学院");
		College info = new College("信息", "学院");
		
		// 为学院创建专业
		computer.add(new Department("软件", "工程"));
		computer.add(new Department("网络", "工程"));
		info.add(new Department("通信", "工程"));
		info.add(new Department("电本", "工程"));
		
		// 将学院添加到大学
		university.add(computer);
		university.add(info);
		
		// 打印
		university.print();
		
		// 假设我们不关系学校, 只关心计算机学院
		computer.print();
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值