设计模式(九)----组合模式

概述

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当做一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分及整体层次。该设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
意图:将对象组合成树形结构以表示"部分-整体"的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。
主要解决:它在树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
何时使用:想表示对象的部分-整体层次结构(树形结构)。希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。
关键代码:树枝内部组合该接口,并且含有内部属性List,里面放Component。
优点:高层模块调用简单。节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而非接口,违反了依赖倒置原则。
使用场景:部分、整体场景,如树形菜单、文件、文件夹的管理。

实例

下面的实例演示了一个组织中员工的层次结构。
定义一个员工类Employee,该类被当做组合模型类。测试类使用Employee类来添加部门层次结构,并打印所有员工信息。
创建Employee类
该类带有Employee对象的列表

public class Employee {
	//姓名
	private String name;
	//职位
	private String post;
	//工资
	private Integer salary;
	//下属
	private List<Employee> subordinates;

	//构造函数
	public Employ(String name,String post,Integer salary) {
		this.name = name;
		this.post = post;
		this.salary = salary;
		this.subordinates = new ArrayList<Employee>();
	}

	public void addEmployee(Employee e) {
		subordinates.add(e);
	}
	public void removeEmployee(Employee e) {
		subordinates.remove(e);
	}
	//省略setter和getter方法
}

测试类

public class CompositePatternDemo {
	public static void main(String[] args) {
		Employee ceo = new Employee("宋江","ceo",3000);
		Employee softwareLeader = new Employee("武松","软件部门经理",2000);
		Employee marketLeader = new Employee("林冲","市场部门经理",2000);
		Employee backDeveloper = new Employee("花荣","后端开发人员",1000);
		Employee frontDeveloper = new Employee("燕青","前端开发人员",1000);
		Employee salesman1 = new Employee("雷横","销售人员1",1000);
		Employee salesman2 = new Employee("张顺","销售人员2",1000);

		ceo.add(softwareLeader);
		ceo.add(marketLeader);
		softwareLeader.add(backDeveloper);
		softwareLeader.add(frontDeveloper);
		marketLeader.add(salesman1);
		marketLeader.add(salesman2);

		//打印ceo信息
		printEmployee(ceo);
		for(Employee e1 : ceo.getSubordinates()) {
			//打印部门经理信息
			printEmployee(e1);
			for(Employee e2 : e1.getSubordinates()) {
				//打印普通员工信息
				printEmployee(e2);
			}
		}
	}

	//打印员工信息方法
	public static void printEmployee(Employee e) {
		System.out.println("姓名:" + e.getName() + ",职位:" + e.getPost() + ",工资:" + e.getSalary());
	}
}

打印结果
结果
组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),将对象称为节点,即一个根节点包含许多子节点,这些子节点有的仍然包含子节点,有的不包含子节点。
所谓组合模式,就是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,这种组合是区别于继承的,另一层含义是指树形结构子节点的抽象(将叶子节点与树枝节点抽象为子节点),区别于普通的分别定义叶子节点与树枝节点的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值