10年 Java程序员,硬核人生!勇往直前,永不退缩!

欢迎围观我的git:https://github.com/R1310328554/spring_security_learn 寻找志同道合的有志于研究技术的朋友,关注本人微信公众号: 觉醒的码农,或Q群 165874185

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

要素:

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角色

 

posted on 2014-08-17 01:06  CanntBelieve  阅读(390)  评论(0编辑  收藏  举报