设计模式之组合模式

1,为什么要使用组合设计模式

有时候我们会遇到一种对象之间存在时层级关系(注意这里是指的对象),如


那么,我们有没有必要为每一个对象都单独写类?当然没有必要,那么这其实就是一棵树型的对象结构了.组合设计模式就是为了这种结构而生的.


由Component派生出了Leaf和Composite这两个,分别称之为叶节点和支节点.叶节点不具有增加和消除节点的能力.

2,什么是组合设计模式

组合设计模式将对象组合成树形结构以表示"部分-整体"的关系

3,怎么使用组合设计模式

UML类图


舵主在这里作为了支节点,左护法和右护法作为了叶节点.

具体的代码:

成员.interface

public interface 成员{
	public void 增加成员(成员 c);
	public void 减少成员(成员 c);
	public void 显示成员职能();
}
舵主.class

public class 舵主  implements 成员{
	public final static int 总舵主 = 0;
	public final static int 分舵主 = 1;
	private String name;
	ArrayList<成员> list = new ArrayList<成员>();
	public 舵主(int type) throws Exception{
		if(type < 0 || type > 1){
			throw new Exception("类型错误");
		}
		switch(type){
			case 舵主.总舵主:
				name = "总舵主";
				break;
			case 舵主.分舵主:
				name = "分舵主";
				break;
			default:
				break;
		}
	}
	@Override
	public void 增加成员(成员 c) {
		// TODO Auto-generated method stub
		list.add(c);
	}

	@Override
	public void 减少成员(成员 c) {
		// TODO Auto-generated method stub
		list.remove(c);
	}

	@Override
	public void 显示成员职能() {
		// TODO Auto-generated method stub
		System.out.print("我是"+name+"\n");
		for(成员 c : list){
			if(!(c instanceof 舵主)){
				c.显示成员职能();
			}
		}
		System.out.print("--------------"+"\n");
	}

}

左护法.class

public class 左护法  implements 成员{
	//叶节点是不能增加和减少节点的
	@Override
	public void 增加成员(成员 c) {
		// TODO Auto-generated method stub
		System.out.print("护法是不能增加成员的\n");
	}
	//叶节点是不能增加和减少节点的
	@Override
	public void 减少成员(成员 c) {
		// TODO Auto-generated method stub
		System.out.print("护法是不能减少成员的\n");
	}

	@Override
	public void 显示成员职能() {
		// TODO Auto-generated method stub
		System.out.print("左护法保护舵主\n");
	}

}

右护法.class

public class 右护法  implements 成员{
	//叶节点是不能增加和减少节点的
	@Override
	public void 增加成员(成员 c) {
		// TODO Auto-generated method stub
		System.out.print("护法是不能增加成员的\n");
	}
	//叶节点是不能增加和减少节点的
	@Override
	public void 减少成员(成员 c) {
		// TODO Auto-generated method stub
		System.out.print("护法是不能减少成员的\n");
	}

	@Override
	public void 显示成员职能() {
		// TODO Auto-generated method stub
		System.out.print("右护法保护舵主\n");
	}

}

Main.class

public class Main {
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		舵主 总舵主 = new 舵主(舵主.总舵主);
		舵主 分舵主1 = new 舵主(舵主.分舵主);
		舵主 分舵主2 = new 舵主(舵主.分舵主);
		总舵主.增加成员(分舵主1);
		总舵主.增加成员(new 左护法());
		总舵主.增加成员(new 右护法());
		分舵主1.增加成员(分舵主2);
		分舵主1.增加成员(new 左护法());
		分舵主1.增加成员(new 右护法());
		分舵主2.增加成员(new 左护法());
		分舵主2.增加成员(new 右护法());
		总舵主.显示成员职能();
		分舵主1.显示成员职能();
		分舵主2.显示成员职能();
	}

}
最后输出

我是总舵主
左护法保护舵主
右护法保护舵主
--------------
我是分舵主
左护法保护舵主
右护法保护舵主
--------------
我是分舵主
左护法保护舵主
右护法保护舵主
--------------



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值