安全式合成模式的缺点是不够透明,因为树叶类和树枝类将具有不同的接口。
透明式合成模式的结构
与安全式的合成模式不同的是,透明式的合成模式要求所有的具体构件类,不论树枝构件还是树叶构件,均符合一个固定接口。

源代码
抽象构件角色类
[java]
package com.bankht.Composite.transparent;
import java.util.List;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-25 下午10:10:55
*
* @类说明 :抽象构件角色类
*/
public abstract class Component {
/**
* 输出组建自身的名称
*/
public abstract void printStruct(String preStr);
/**
* 聚集管理方法,增加一个子构件对象
*
* @param child
* 子构件对象
*/
public void addChild(Component child) {
/**
* 缺省实现,抛出异常,因为叶子对象没有此功能 或者子组件没有实现这个功能
*/
throw new UnsupportedOperationException("对象不支持此功能");
}
/**
* 聚集管理方法,删除一个子构件对象
*
* @param index
* 子构件对象的下标
*/
public void removeChild(int index) {
/**
* 缺省实现,抛出异常,因为叶子对象没有此功能 或者子组件没有实现这个功能
*/
throw new UnsupportedOperationException("对象不支持此功能");
}
/**
* 聚集管理方法,返回所有子构件对象
*/
public List
/**
* 缺省实现,抛出异常,因为叶子对象没有此功能 或者子组件没有实现这个功能
*/
throw new UnsupportedOperationException("对象不支持此功能");
}
}
package com.bankht.Composite.transparent;
import java.util.List;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-25 下午10:10:55
*
* @类说明 :抽象构件角色类
*/
public abstract class Component {
/**
* 输出组建自身的名称
*/
public abstract void printStruct(String preStr);
/**
* 聚集管理方法,增加一个子构件对象
*
* @param child
* 子构件对象
*/
public void addChild(Component child) {
/**
* 缺省实现,抛出异常,因为叶子对象没有此功能 或者子组件没有实现这个功能
*/
throw new UnsupportedOperationException("对象不支持此功能");
}
/**
* 聚集管理方法,删除一个子构件对象
*
* @param index
* 子构件对象的下标
*/
public void removeChild(int index) {
/**
* 缺省实现,抛出异常,因为叶子对象没有此功能 或者子组件没有实现这个功能
*/
throw new UnsupportedOperationException("对象不支持此功能");
}
/**
* 聚集管理方法,返回所有子构件对象
*/
public List
/**
* 缺省实现,抛出异常,因为叶子对象没有此功能 或者子组件没有实现这个功能
*/
throw new UnsupportedOperationException("对象不支持此功能");
}
}
树枝构件角色类,此类将implements Conponent改为extends Conponent,其他地方无变化。
[java]
package com.bankht.Composite.transparent;
import java.util.ArrayList;
import java.util.List;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-25 下午10:11:20
*
* @类说明 :树枝构件角色类,此类将implements Conponent改为extends Conponent,其他地方无变化。
*/
public class Composite extends Component {
/**
* 用来存储组合对象中包含的子组件对象
*/
private List
/**
* 组合对象的名字
*/
private String name;
/**
* 构造方法,传入组合对象的名字
*
* @param name
* 组合对象的名字
*/
public Composite(String name) {
this.name = name;
}
/**
* 聚集管理方法,增加一个子构件对象
*
* @param child
* 子构件对象
*/
public void addChild(Component child) {
childComponents.add(child);
}
/**
* 聚集管理方法,删除一个子构件对象
*
* @param index
* 子构件对象的下标
*/
public void removeChild(int index) {
childComponents.remove(index);
}
/**
* 聚集管理方法,返回所有子构件对象
*/
public List
return childComponents;
}
/**
* 输出对象的自身结构
*
* @param preStr
* 前缀,主要是按照层级拼接空格,实现向后缩进
*/
@Override
public vo