[DP]Composite设计模式

我们的KFG餐厅非常的big,非常的有逼格。

但是我们这里带来一个问题,你作为CEO是不可能管理本集团内所有人的。

遥想当初我们幸幸苦苦开了第一家店,那个时候 你作为店长 管理着手下不多的几个员工。

然后我们在有了第二家店,第三家,在某个城市 你作为这个城市的负责人 管理下属的所有员工。

然后我们公司越来越大,已经在华北地区形成了不小的影响,而你作为整个华北地区的负责人,管理着个个城市的负责人。

随着我们的共同努力,公司称霸全国。而你作为ceo则是管理各个地区的负责人。

好了现在问题来了,要解决上述这种树形结构的员工管理树,该如何实现。


注意我这里用圆角方框 和方框 将以上的员工 分成两类,一类是 管理人员(圆角方框),另外一类则是我们的标准的普通员工,它们都是员工,ceo也不例外,要说ceo为谁打工,为了自己呗。

abstract class Staff {
	private String name;
	private String postion;

	public Staff(String name, String postion) {
		this.name = name;
		this.postion = postion;
	}

	public String getName() {
		return name;
	}

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

	public String getPostion() {
		return postion;
	}

	public void setPostion(String postion) {
		this.postion = postion;
	}

	abstract public void doWork();

	public void hireStaff(Staff staff) {
	}

	public void fireStaff(Staff staff) {
	}
}

class Magnager extends Staff {

	private List<Staff> staffs = new LinkedList<>();

	public Magnager(String name, String postion) {
		super(name, postion);
	}

	@Override
	public void doWork() {
		System.out.println("im counting sheet.");
	}

	@Override
	public void hireStaff(Staff staff) {
		staffs.add(staff);
	}

	@Override
	public void fireStaff(Staff staff) {
		staffs.remove(staff);
	}
}

class NormalStaff extends Staff {

	public NormalStaff(String name, String postion) {
		super(name, postion);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void doWork() {
		System.out.println("im doing some work.");
	}
}

这样我们就可以管理多级员工的问题了。当然你要说你既担任ceo,同时管理 负责人 和普通员工 都是没有任何问题的。

public class Composite {
	public static void main(String[] args) {
		//我们的ceo 出场了
		Staff ceo = new Magnager("HeapStackk", "ceo");
		//但是只有ceo 我们不就成了光杆司令,所以我们得找到一个华东地区负责人
		Staff huaDongAreaDirector = new Magnager("huadong", "director");
		ceo.hireStaff(huaDongAreaDirector);
		//华东地区负责人说,不行 我也要找人帮我打下手
		Staff nanjingAreaDirector = new Magnager("nanjing", "director");
		huaDongAreaDirector.hireStaff(nanjingAreaDirector);
		//然后南京的负责人 就雇佣了一名店长…… 然后店长管理其员工
		Staff KFGDianZhang = new Magnager("dianzhang", "dianzhang");
		nanjingAreaDirector.hireStaff(KFGDianZhang);
		//我们的南京负责人 表示对店长不满意 所以我要炒你鱿鱼
		nanjingAreaDirector.fireStaff(KFGDianZhang);
		//我们的ceo表示 好无聊,不如我也自己直接参与一家店 做一个店长 雇佣人吧。
		Staff cleaner = new NormalStaff("haha", "cleaner");
		ceo.hireStaff(cleaner);
	}
}

纵观上述过程,我们需要将该种设计模式抽象出来,使的具有通性。


构建模式的组成
          抽象构件角色(component):是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。这个接口可  以用来管理所有的子对象。(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。  
          树叶构件角色(Leaf):在组合树中表示叶节点对象,叶节点没有子节点。并在组合中定义图元对象的行为。
          树枝构件角色(Composite):定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。
          客户角色(Client):通过component接口操纵组合部件的对象。   

在上述例子中:

          抽象构建角色:Staff 无论是管理者 还是普通的员工都是员工。提供了管理员工的接口。

          树叶构建角色:NormalStaff 实际上并没有子节点,虽然提供了雇用方法,然并没什么卵用。

          树枝构建角色:Manager 能够存储子部件,就是手下多少个员工。

         客户角色:这个里面并没有明确。


效果
     1) • 定义了包含基本对象和组合对象的类层次结构 基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去。客户代码中,任何用到   基本对象的地方都可以使用组合对象。
     2) • 简化客户代码 客户可以一致地使用组合结构和单个对象。通常用户不知道 (也不关心)处理的是一个叶节点还是一个组合组件。这就简化了客户代码 , 因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。
    3) • 使得更容易增加新类型的组件 新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需因新的Component类而改变。
    4) • 使你的设计变得更加一般化 容易增加新组件也会产生一些问题,那就是很难限制组合中的组件。有时你希望一个组合只能有某些特定的组件。使用Composite时,你不能依赖类型系统施加这些约束,而必须在运行时刻进行检查。



适用性
以下情况下适用Composite模式:
1).你想表示对象的部分-整体层次结构
2).你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


spring中暂时未读到疑似composite设计模式的代码案例。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值