- N +

设计模式之组合模式

设计模式之组合模式原标题:设计模式之组合模式

导读:

什么是组合模式?使对象组合成树形的结构。使用户对单个对象和组合对象的使用具有一致性。组合模式角色——抽象构件角色(Component):为组合中的对象声明接口, 在适当的情况下...

文章目录 [+]

什么是组合模式

使对象组合成树形的结构。使用户对单个对象和组合对象的使用具有一致性。

组合模式角色

——抽象构件角色(Component):为组合中的对象声明接口, 在适当的情况下,也可实现所有类共有接口的缺省行为。

——树叶构件角色(Leaf):在组合中表示叶节点对象,没有子节点,实现抽象构件角色声明的接口。

——树枝构件角色(Composite):在组合中表示分支节点对象,有子节点,实现抽象构件角色声明的接口;存储子部件

组合模式场景

  1 表示对象的 部分-整体 层次结构

  2 忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象。

组合模式两种实现方式

亚博体育官网人生赢家亚博体育PC版——透明式的组合模式:将管理子构件的方法定义在Component接口中,这样Leaf类就需要处理这些对其意义不大的方法(空实现或抛异常),在接口层次上Leaf和Composite没有区别,即透明性。Component 声明的这些管理子构件的方法对于Leaf来说是不适用的,这样也就带来了一些安全性问题。


——安全式的组合模式:将管理子构件的方法定义在Composite中,这样编译时任何从Leaf 中增加或删除对象的尝试都将被发现,但是由于Leaf和Composite有不同的接口(方法),又失去了透明性。


组合模式代码讲解

【安全的组合模式】

  这种组合模式,叶子节点,也就是单个对象不具有对象的控制功能。仅仅有简单的业务操作。

public?interface?Component?{

????Composite?getCmposite();

????void?sampleComposite();

}

class?Leaf?implements?Component{

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

????@Override
????public?void?sampleComposite()?{
????????//?TODO?Auto-generated?method?stub
????????System.out.println("Leaf?operation");
????}
????
}


class?Composite?implements?Component?{

????List?list?=?new?ArrayList();

????@Override
????public?Composite?getCmposite()?{
????????//?TODO?Auto-generated?method?stub
????????return?this;
????}

????@Override
????public?void?sampleComposite()?{
????????//?TODO?Auto-generated?method?stub
????????
????????System.out.println("Composite?operation");
????????for?(Component?com?:?list)?{
????????????com.sampleComposite();
????????}
????????
????????
????}

????public?void?add(Component?component)?{
????????list.add(component);
????}

????public?void?remove(Component?component)?{
????????list.remove(component);
????}

}

测试:

public?static?void?main(String[]?args)?{

????????Component?leaf1?=?new?Leaf();
????????Component?leaf2?=?new?Leaf();
????????Component?composite?=?new?Composite();
????????composite.getCmposite().add(leaf1);
????????composite.getCmposite().add(leaf2);
????????composite.getCmposite().sampleComposite();

????}

 执行结果

Composite?operation
Leaf?operation
Leaf?operation

?【透明的组合模式】

  这种组合模式,叶子节点与组合对象具有相同的方法,外表看来毫无差异。不过叶子节点的处理方法默认为空。忽略叶子节点,与组合对象的差异性。

public?interface?Component?{

????Composite?getCmposite();

????void?sampleComposite();
????
????public?void?add(Component?component)?;
????
????public?void?remove(Component?component);

}

class?Leaf?implements?Component?{

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

????@Override
????public?void?sampleComposite()?{
????????//?TODO?Auto-generated?method?stub
????????System.out.println("Leaf?operation");
????}

????@Override
????public?void?add(Component?component)?{
????????//?TODO?Auto-generated?method?stub
????????
????}

????@Override
????public?void?remove(Component?component)?{
????????//?TODO?Auto-generated?method?stub
????????
????}

}

class?Composite?implements?Component?{

????List?list?=?new?ArrayList();

????@Override
????public?Composite?getCmposite()?{
????????//?TODO?Auto-generated?method?stub
????????return?this;
????}

????@Override
????public?void?sampleComposite()?{
????????//?TODO?Auto-generated?method?stub

????????System.out.println("Composite?operation");
????????for?(Component?com?:?list)?{
????????????com.sampleComposite();
????????}

????}

????@Override
????public?void?add(Component?component)?{
????????list.add(component);
????}

????@Override
????public?void?remove(Component?component){
????????list.remove(component);
????}



}


本文标题:设计模式之组合模式
本文链接:http://www.kyjszj.com/wdzl/22.html
作者授权:除特别说明外,本文由?开源技术之家?原创编译并授权?开源技术之家?刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇:

发表评论中国互联网举报中心

快捷回复:

    评论列表 (暂无评论,共575人参与)参与讨论

    还没有评论,来说两句吧...