经典的设计模式11——组合模式

文章目录


组合模式

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
应用场景:需求中是体现部分与整体的结构以及用户可以忽略组合对象对单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑用组合模式。
本质:统一子对象和组合对象。
缺点:很难限制组合中的组件类型。
一些典型例子:绘图编辑器,图形捕捉系统,drow.io
有两个要实现的例子,一个商品类别树,一个是公司管理的例子,这里以公司管理为例子。

package 公司管理;

public abstract class company {
	protected String name;

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

	public abstract void add(company c);

	public abstract void remove(company c);

	public abstract void display(int depth);

	public abstract void lvxingzhize();

}

package 公司管理;

public class caiwubu extends company {

	public caiwubu(String name) {
		super(name);
	}

	@Override
	public void add(company c) {
		System.out.println("不能再加叶子");

	}

	@Override
	public void remove(company c) {
		System.out.println("不能再减少叶子");

	}

	@Override
	public void display(int depth) {
		String str = "";
		for (int i = 0; i < depth; i++) {
			str += "-";
		}
		System.out.println(str + name);

	}

	@Override
	public void lvxingzhize() {
		System.out.println(name + ":负责员工招聘管理");

	}

}

package 公司管理;

public class renliziyuanbu extends company {

	public renliziyuanbu(String name) {
		super(name);
	}

	@Override
	public void add(company c) {
		System.out.println("不能再加叶子");

	}

	@Override
	public void remove(company c) {
		System.out.println("不能再减少叶子");
	}

	@Override
	public void display(int depth) {
		String str = "";
		for (int i = 0; i < depth; i++) {
			str += "-";
		}
		System.out.println(str + name);
	}

	@Override
	public void lvxingzhize() {
		System.out.println(name + ":公司财务收支管理");

	}

}

package 公司管理;

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

public class concreteCompany extends company {

	private List<company> children = new ArrayList<company>();

	public concreteCompany(String name) {
		super(name);
	}

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

	@Override
	public void remove(company c) {
		children.remove(c);

	}

	@Override
	public void display(int depth) {
		String str = "";
		for (int i = 0; i < depth; i++) {
			str += "-";
		}
		System.out.println(str + name);
		for (int i = 0; i < children.size(); i++) {
			company c = children.get(i);
			c.display(depth + 2);
		}

	}

	@Override
	public void lvxingzhize() {
		for (int i = 0; i < children.size(); i++) {
			company c = children.get(i);
			c.lvxingzhize();
		}

	}

}

package 公司管理;

public class Client {

	public static void main(String[] args) {
		concreteCompany root = new concreteCompany("北京总共公司");
		root.add(new renliziyuanbu("总公司人力资源部"));
		root.add(new caiwubu("总公司财务部"));

		concreteCompany c1 = new concreteCompany("上海华东分公司");
		c1.add(new renliziyuanbu("华东分公司人力资源部"));
		c1.add(new caiwubu("上海华东分公司财务部"));
		root.add(c1);

		concreteCompany c2 = new concreteCompany("上海华东分公司南京办事处");
		c2.add(new renliziyuanbu("上海华东分公司南京办事处资源部"));
		c2.add(new caiwubu("上海华东分公司南京办事处财务部"));
		c1.add(c2);

		concreteCompany c3 = new concreteCompany("上海华东分公司杭州办事处");
		c3.add(new renliziyuanbu("上海华东分公司杭州办事处资源部"));
		c3.add(new caiwubu("上海华东分公司杭州办事处财务部"));
		c1.add(c3);

		System.out.println("公司结构图:");
		root.display(1);
		System.out.println("各部门职责:");
		root.lvxingzhize();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗紫色的乔松(-_^)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值