专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 设计模式

结合设计模式(合成模式)

发布时间:2011-06-19 13:17:51 文章来源:www.iduyao.cn 采编人员:星星草
组合设计模式(合成模式)

组合设计模式(部分-整体设计模式)

主要角色涉及三个

抽象构件角色(component):规定参加参加组合的对象共有的行为,这个接口可以用来管理所有的子对象。

树叶构件角色:参加对象组合的树叶对象。给出add(),remove()之类的方法的平庸实现。一般针对树叶构件的角色不提供add(),remove()等管理子对象的方法。

树枝构件角色:参加组合的对象含有子对象的对象。

组合模式以树结构图的形式去理解。树枝节点可以添加和管理子类元素。树叶节点不具备添加和管理子组件的能力。

所以又分透明式和安全式。

透明式

 下面以我的电脑中的文件夹为例,文件可以增加文件。文件不能再添加子文件。已经是树叶节点。

 树叶和树枝都实现文件夹接口,文件夹可以添加子类文件。同时也继续添加子类文件夹。

而文件是树叶不具备添加子类文件的能力。故提供一个平庸实现。

//抽象构件类

public interface Folder{

     //访问文件夹

     public void visit(Folder folder);

     //添加

     public void add(Folder foler);

     //删除

     public void revmove(Folder folder);

    //多少个文件

    public int size();

}

 

//文件

public class FileLeaf implements Folder{

//访问文件 

 public void visit(Folder folder){

   System.out.println("访问当前的文件")

  }

 

//平庸实现

public void add(Folder folder){

 

}

//平庸实现

public void remove(Folder folder){

 

}

 

public int size(){

 

}

}

 

import java.util.List;

import java.util.ArrayList;

public class CompositeFolder implements Folder{

//管理集合的属性 

private List<Folder> componentList = new ArrayList<Folder>();

  //访问当前的文件夹 

  public void visit(Folder folder){

      if(!CollectionUtils.isEmpty()){

         for(Folder der:componentList){

             if(der==folder){

              System.out.println("访问当前的树枝节点")

          }

       }

     }

    }

//添加

public void add(Folder folder){

componentList .add(folder);

}

 

public void remove(Folder folder){

 componentList .remove(folder);

 

public int size(){

 componentList.size();

}

}

透明式的缺点是运行时。由于树叶节点不具备添加或者删除子文件的能力。运行时会报错。

安全式组合模式

//抽象构件类

public interface Folder{

     //访问文件夹

     public void visit(Folder folder);

}

 

//文件是树叶节点,不具备添加子类文件的能力。不提供这类操作

public class FileLeaf implements Folder{

//访问文件 

 public void visit(Folder folder){

   System.out.println("访问当前的文件")

  }

}

 

//树枝节点提供一个统一的访问接口。有管理子类的能力

public interface CompositeFolder extends Component{

     //添加

     public void add(Folder foler);

     //删除

     public void revmove(Folder folder);

    //多少个文件

    public int size();

}

 

//树枝节点实现类 实现抽树枝接口类

public class CompositeFolderImpl implements CompositeFolder{

 private List<Folder> compositeList = new ArrayList<Folder>();

 //添加

     public void add(Folder folder){

           compositeList.add(folder);

  }

     //删除

     public void remove(Folder folder){

       compositeList.remove(folder);

   }

    //多少个文件

    public int size(){

     compositeList.size();

   }

  

  //访问当前的文件夹 

  public void visit(Folder folder){

      if(!CollectionUtils.isEmpty()){

         for(Folder der:componentList){

             if(der==folder){

              System.out.println("访问当前的树枝节点")

          }

       }

     }

    }

}

 

应用场景:

1, 你表示部分/整体层次结构

2,不用区分单个构件和组合构件的区别时。

优点:

1,客户端很容易添加新的构件,树枝节点和树叶节点。

2,使客户端设计更容易。因为对树枝和树叶节点都是同等对待。

缺点:

 1,通过继承的方式添加新的行为很苦难。

 2,控制树枝构件的类型不太容易。

 

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • 关于后台服务器架构有关问题

    关于后台服务器架构问题 最近小弟在优化后台服务器的工作,因为以前的服务器是采用单进程,单线程,并没有涉及到多台服务器的交互问题...

  • 请问个模式的应用

    请教个模式的应用 要做个公司的权限管理,有三个角色 公司管理员,具有权限M1(a),M1(a,b) 部门经理,具有权限M1(a,b),M2() 部门管理...

  • 继承的优缺点解决方法

    继承的优缺点 请问大家如何理解继承,如何使用好继承? ------解决方案-------------------- 关于这个问题,我的确做了一些思考,推荐...

  • 急设计程序删除文件夹中的已损坏pdf文件解决办法

    急!急!急!设计程序删除文件夹中的已损坏pdf文件 文件夹中总共的pdf文件数量有三十几万,怎么才能删除这些pdf文件中已损坏的pdf文件呢? ...

  • 关于Singleton模式继承的有关问题

    关于Singleton模式继承的问题? 定义一个Singleton类,一般都是要被其他实际的类继承,使这个实际的类具有Singleton功能。 现在看到二...

  • 怎么分析需求以决定用什么设计模式

    如何分析需求以决定用什么设计模式? 最近在看设计模式解析,基本上是陷到里面无法自拔了,我的问题是如何分析需求以决定用什么设计模...

  • 设计模式的应用解决方案

    设计模式的应用 我不知道什么时候该用什么样的设计模式 有号得例子或者教学视频吗 ------解决方案-------------------- 这个...

  • visio2002创建UML类图解决思路

    visio2002创建UML类图 使用visio2002画UML类图,文件-新建-选择绘图类型-UML模型图,就会报下面的错误 Runtime Error Program c:\.....

  • 蜂窝模式?该怎么解决

    蜂窝模式? 啥意思啊 ------解决方案-------------------- 是设计模式中的一个 161592169@qq.com 你给我发歌邮件 我回...

  • [HoWo03]是什么书,在google和百度上都找不到,该怎么解决

    [HoWo03]是什么书,在google和百度上都找不到 [HoWo03]是什么书,在google和百度上都找不到 ------解决方案-------------------- H...

热门推荐: