zoukankan      html  css  js  c++  java
  • Java设计模式—组合模式

    组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。

     

    个人理解:组合模式就是将部分组装成整体。

    定义如下:

    将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

    通用类图如下:

    组合模式的包含角色:


    ● Component 抽象构件角色
    定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。

    ● Leaf 叶子构件
    叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。
    ● Composite 树枝构件
    树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。

    通用源代码:

    抽象构件
    public abstract class Component {
         //个体和整体都具有的共享
         public void do Something(){
                 //编写业务逻辑
         }
    }
    


     

    树枝构件
    public class Composite extends Component {
         //构件容器
         private Array List<Component> component Array List = new Array List<Component>()
         //增加一个叶子构件或树枝构件
         public void add(Component component){
                 this.component Array List.add(component);
         }
         //删除一个叶子构件或树枝构件
         public void remove(Component component){
                 this.component Array List.remove(component);
         }    
     //获得分支下的所有叶子构件和树枝构件
         public Array List<Component> get Children(){
                 return this.component Array List;
         }
    }
    



    树叶节点是没有子下级对象的对象,定义参加组合的原始对象行为。

    树叶构件
    public class Leaf extends Component {
         /*
          * 
    可以覆写父类方法
          * public void do Something(){
          * 
          * }
          */
    }
    

    测试类负责树状结构的建立,并可以通过递归方式遍历整个树。

    public class Client {
         public static void main(String[] args) {
                //创建一个根节点
                 Composite root = new Composite();
                 root.do Something();
                 //创建一个树枝构件
                 Composite branch = new Composite();
                 //创建一个叶子节点
                 Leaf leaf = new Leaf();
                 //建立整体
                 root.add(branch);
                 branch.add(leaf);          
         }
         //通过递归遍历树
         public static void display(Composite root){
                 for(Component c:root.get Children()){
                      if(c instanceof Leaf){ //叶子节点
                              c.do Something();
                      }else{ //树枝节点
                              display((Composite)c);
                      }
                 }
         }
    }
    


    组合模式的优点:


    ● 高层模块调用简单

    一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
    ● 节点自由增加
    使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点是不是都很容易,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。


    组合模式的缺点:


           组合模式有一个非常明显的缺点,看到我们在场景类中的定义,提到树叶和树枝使用时的定义了吗?直接使用了实现类!这在面向接口编程上是很不恰当的,与依赖倒置原则冲突,读者在使用的时候要考虑清楚,它限制了你接口的影响范围。

    使用场景:
    ● 维护和展示部分-整体关系的场景,如树形菜单、文件和文件夹管理。
    ● 从一个整体中能够独立出部分模块或功能的场景。

    注意事项:

    只要是树形结构,就要考虑使用组合模式,这个一定要记住,只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,考虑一下组合模式吧。

  • 相关阅读:
    今天开始用 VSU 2010
    Visual Studio 2010 模型设计工具 基本应用
    Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
    Enterprise Library 4.1 Security Block 快速使用图文笔记
    解决“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。”(图)
    一个Oracle存储过程示例
    Enterprise Library 4.1 Application Settings 快速使用图文笔记
    Oracle 10g for Windows 简体中文版的安装过程
    Oracle 11g for Windows 简体中文版的安装过程
    Oracle 9i 数据库 创建数据库 Net 配置 创建表 SQL查询 创建存储过程 (图)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467276.html
Copyright © 2011-2022 走看看