设计模式--结构型--组合模式

一、组合模式简介(Brief Introduction)

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

二、解决的问题(What To Solve)

解决整合与部分可以被一致对待问题。

三、组合模式分析(Analysis)

Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现
Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他的子节点对象
Composite:组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子组件有关的操作
Client:客户端,通过组件接口来操作组合结构里面的组件对象

四、实例代码

1、Component抽象类

public abstract class Component {
	public abstract void someOperation(String str);
	
	public void addChild(Component child){
		throw new UnsupportedOperationException("对象不支持这个功能");
	}
	public void removeChild(Component child) {
		throw new UnsupportedOperationException("对象不支持这个功能");
	}

	public Component getChildren(int index) {
		throw new UnsupportedOperationException("对象不支持这个功能");
	}
}

2、Composite组合对象

public class Composite extends Component {

	private List<Component> components = null;
	
	private String name = "";
	
	public Composite(String name){
		this.name = name;
	}
	
	public void someOperation(String str) {
		System.out.println(str+"+"+this.name);
		//如果还包含有子组件,那么就输出这些子组件对象
		if(this.components!=null){
			//然后添加一个空格,表示向后缩进一个空格
			str+=" ";		
			//输出当前对象的子对象了
			for(Component c : components){
				//递归输出每个子对象
				c.someOperation(str);
			}
		}
	}
	
	public void addChild(Component child){
		if (components == null) {
			components = new ArrayList<Component>();
		}
		components.add(child);
	}

}

3、Leaf叶子节点对象

public class Leaf extends Component {

	private String name = "";
	public Leaf(String name){
		this.name = name;
	}
	
	public void someOperation(String str) {
		System.out.println(str+"-"+name);
	}
}

4、客户端调用

public class Client {

	public static void main(String[] args) {

		Component root = new Composite("电脑");
		Component c1 = new Composite("台式机");
		Component c2 = new Composite("笔记本");
		
		Component leaf1 = new Leaf("联想台式机");
		Component leaf2 = new Leaf("戴尔台式机");
		Component leaf3 = new Leaf("联想笔记本");
		Component leaf4 = new Leaf("戴尔笔记本");
		Component leaf5 = new Leaf("华硕笔记本");
		
		root.addChild(c1);
		root.addChild(c2);
		
		c1.addChild(leaf1);
		c1.addChild(leaf2);
		c2.addChild(leaf3);
		c2.addChild(leaf4);
		c2.addChild(leaf5);
		
		root.someOperation("|");
	}
}
运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值