组合模式

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

Component(抽象构件接口)
 -为组合的对象声明接口
 -在某些情况下实现从此接口派生出的所有类共有的默认行为
 -定义一登上接口可以访问及管理它的多个子部件
Leaf(叶部件)
 -在组合中表示叶结点对象,叶节点没有子节点
 -定义组合中接口对象的行为
Composite(组合类)
 -定义有子节点(子部件)的部件的行为
 -存储子节点(子部件)
 -在Component接口中实现与子部件相关的操作
Client(客户端)
 -通过Component接口控制组合部件的对象


组合模式有两种实现方式:
1)将管理子元素的方法定义在Composite类中

public interface Component {
 public void doSomething();
}

public class Composite implements Component {
 private List<Component> list=new ArrayList<Component>();
 public void add(Component component){
  list.add(component);
 }
 public void remove(Component component){
  list.remove(component);
 }
 public List<Component> getAll(){
  return this.list;
 }
 @Override
 public void doSomething() {
  for(Component component:list){
   component.doSomething();
  }
 }
}

public class Leaf implements Component {
 @Override
 public void doSomething() {
  System.out.println("执行方法");
 }
}

public class Client {
 public static void main(String[] args) {
  Component leaf1=new Leaf();
  Component leaf2=new Leaf();
  Composite comp1=new Composite();
  comp1.add(leaf1);
  comp1.add(leaf2);
  Component leaf3=new Leaf();
  Component leaf4=new Leaf();
  Composite comp2=new Composite();
  comp2.add(comp1);
  comp2.add(leaf3);
  comp2.add(leaf4);
  comp2.doSomething();
 }
}

2)将管理子元素的方法定义在Component接口中,这样Leaf类就需要对些方法空实现。

public interface Component {
 public void doSomething();
 public void add(Component component);
 public void remove(Component component);
 public List<Component> getAll();
}

 public class Composite implements Component {
 private List<Component> list=new ArrayList<Component>();
 @Override
 public void doSomething() {
  for(Component component:list){
   component.doSomething();
  }
 }
 @Override
 public void add(Component component) {
  list.add(component);
 }
 @Override
 public void remove(Component component) {
  list.remove(component);
 }
 @Override
 public List<Component> getAll() {
  return this.list;
 }
}

public class Leaf implements Component {
 @Override
 public void doSomething() {
  System.out.println("执行方法");
 }
 @Override
 public void add(Component component) {}
 @Override
 public void remove(Component component) {}
 @Override
 public List<Component> getAll() {
  return null;
 }
}

public class Client {
 public static void main(String[] args) {
  Component leaf1=new Leaf();
  Component leaf2=new Leaf();
  Component comp1=new Composite();
  comp1.add(leaf1);
  comp1.add(leaf2);
  Component leaf3=new Leaf();
  Component leaf4=new Leaf();
  Component comp2=new Composite();
  comp2.add(comp1);
  comp2.add(leaf3);
  comp2.add(leaf4);
  comp2.doSomething();
 }
}

posted @ 2011-12-15 12:44  残星  阅读(172)  评论(0编辑  收藏  举报