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

    要素:

    1 统一的接口,有对自身的add、remove、getChild、operation等方法

    2 接口有 Leaf、Leaf构成的复杂Composite

    package designpattern.structure.composite;
    
    public interface IComponent {
    
        public abstract void add(IComponent c); //增加成员  
        public abstract void remove(IComponent c); //删除成员  
        public abstract IComponent getChild(int i); //获取成员  
        public abstract void operation();  //业务方法  
    }
    
    package designpattern.structure.composite;
    
    import java.util.ArrayList;
    
    public class Composite implements IComponent {  
        private ArrayList<IComponent> list = new ArrayList<IComponent>();  
          
        public void add(IComponent c) {  
            list.add(c);  
        }  
          
        public void remove(IComponent c) {  
            list.remove(c);  
        }  
          
        public IComponent getChild(int i) {  
            return (IComponent)list.get(i);  
        }  
        
        
        public void operation() {  
            //容器构件具体业务方法的实现  
            //递归调用成员构件的业务方法  
            for(Object obj:list) {  
                ((IComponent)obj).operation();  
            }  
        }    
        
    }
    
    package designpattern.structure.composite;
    
    public class Leaf implements IComponent {

        String name;
        public Leaf(String name) {
          this.name = name;
        }

    public void add(IComponent c) {
            // TODO Auto-generated method stub
            System.out.println("Leaf.add()");
        }
    
        public IComponent getChild(int i) {
            // TODO Auto-generated method stub
            return null;
        }
    
        public void operation() {
            System.out.println("Leaf.operation() : " + this.name);
        }
    
        public void remove(IComponent c) {
            // TODO Auto-generated method stub
            
        }
    
    }
    

    package designpattern.structure.composite;

    /*

    *
    * 关键:
    *
    * 1 需要有add/remove/getchild/operation方法
    * 2 Composite包含元素为component的list
    * 3 Composite的operation 方法需要对所有child遍历执行其operation方法
    *
    *
    * 1.组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
    2.客户端可以 *** 一致地使用一个组合结构或其中单个对象 ( 重点!!!)*** ,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
    3.在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
    4.组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单

    */
    public class Client {

    
    

      /**
      * @param args
      */
      public static void main(String[] args) {

      Composite composite = new Composite();
      composite.add(new Leaf("leaf1"));
      composite.add(new Leaf("leaf2"));
      composite.add(new Leaf("leaf3"));
      composite.add(new Leaf("leaf4"));

      composite.operation();
      }

    
    

    }

     

    我还是不太明白为什么叫做“组合”模式。。 是因为此模式中复杂对象都是简单对象‘组合’而成的吗?  就如一棵树,一个组织,

    —— 一片叶子(或者说分支,branch)可以(广义的)构成一棵树,叶子和叶子通过树枝连接构成一颗更大的树——

    —— 一个人可以(广义的)构成一小组织,多个人构成一个团队,多个团队构成部门,多部门构成机构,多机构构成公司

    —— 而单个人、团队、部门、机构、公司—— 都可以广义的理解为组织

    —— 这里的组织即为 IComponent , 最简单的组织为Leaf角色,其他有Leaf构成的组织为Composite角色

  • 相关阅读:
    Dao跨事务调用实现转账功能
    QueryRunner类 的應用,以及ResultSetHandler 接口的实现类
    C3P0数据源的使用
    iOS中UI阶段常用的一些方法
    谷歌云服务器的使用
    Odoo学习之domain表达式【转载】
    odoo 视图继承
    Odoo字段类型详解
    odoo12:命令行
    xpath转义‘
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/3917193.html
Copyright © 2011-2022 走看看