安全透明的合成模式

来源:互联网 发布:ubuntu sudo使用 编辑:程序博客网 时间:2024/04/29 06:52

合成模式:

【类图】

合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。

角色划分:

        抽象构件角色:参与组合的对象给定一个接口。这个角色给出共有接口及其默认行为。

        树叶构件角色:参加组合的树叶对象。树叶对象没有下级对象。

        树枝构件角色:参加有子对象的对象,并给出树枝构件对象的行为。

安全合成模式:


这一种合成模式只能是树枝节点才能添加子节点,叶子节点是不能添加子节点的。只能在树枝节点上面添加子节点对其扩展。

叶子节点只要确定了就不能被改变。之所以是安全模式是因为叶子节点Leaf没有添加子节点的功能,避免编译误调用了叶子节点造成的错误。

缺点:叶子节点对象和树枝节点对象具有不同的接口,缺乏透明性。



下面是透明的合成模式:

上面的类图给我们展示了,树枝节点和叶子节点都能添加子节点。为了不让客户误调用叶子节点对象的AddChild方法,解决办法是重载Component类

的AddChild方法,在运行时抛出异常,要求在测试上测试人员务必测试每一条分支,避免没测试到的分支存在隐患。

这时的叶子节点可能只暂时的叶子节点,如果在开发中要对叶子扩展,可以对相应的叶子节点添加子节点。这就存在把叶子节点转换成为了树枝节点的可能。

可以在不改变树形的原有结构中,对其叶子节点进行扩展。


合成模式:容易明确局部与整体的关系,安全的合成模式,透明性不高,扩展性不好。透明的合成模式,安全性不高。在可视组件库VCL中,当你拖动一个控件,还能像这个控件里面再加入其他控件,这就表明VCL中使用的透明合成模式,VCL中是不安全的。


原创粉丝点击