合成模式

一.相关例子:

文件系统 ,java.awt.Component

二.UML图:

三.实现方式:

两者的区别在于将所有子类管理方法(诸如add(),remove(),getChild()等方法)放在哪

1.安全式:在Composite类中声明了所有的子类管理方式,可惜这种方法不够透明,Leaf类和Composite类不具有相同的接口

2.透明式:在Component中声明了所有的子类管理方法,可惜这种方法不安全,因为让Leaf"有机会"去处理那些他不该执行的方法,诸如getChild();

四.角色和安全式的实现代码:

1.抽象构件(Component):

package com.se.design.component;

/*
 * 这里实现的是安全式的合成模式
 * */

public interface Component {
	
	/*
	 * 返回自己 
	 * */
	public Composite getSelf();

	/*
	 * Leaf和Composite共有方法
	 * */
	public void commonMethod();
}

2.树枝构件(Composite):

package com.se.design.component;

import java.util.Enumeration;
import java.util.Vector;

public class Composite implements Component {

	// 存放了自己所有的子节点
	Vector<Component> components = new Vector<Component>();

	@Override
	public Composite getSelf() {
		return this;
	}

	@Override
	public void commonMethod() {
		System.out.println("I'm Composite");
		Enumeration<Component> enumeration = components.elements();
		while (enumeration.hasMoreElements()) {
			((Component) enumeration.nextElement()).commonMethod();
		}
	}

	public void add(Component comoponent) {
		this.components.add(comoponent);
	}

	public void remove(Component component) {
		this.components.remove(component);
	}

}

3.树叶构件:

package com.se.design.component;

public class Leaf implements Component {

	@Override
	public Composite getSelf() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void commonMethod() {
		// TODO Auto-generated method stub
		System.out.println("I'm Leaf");
	}

}

毕!

转载于:https://my.oschina.net/vfan140/blog/55170

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值