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

    组合模式(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();
     }
    }

  • 相关阅读:
    正则表达式(Python3-re模块示例)
    format函数之几种常规用法
    元组的拆包
    Python3魔术方法实现一摞卡牌
    Python字典的常见操作
    70. Climbing Stairs(js)
    69. Sqrt(x)(js)
    68. Text Justification(js)
    67. Add Binary(js)
    66. Plus One(js)
  • 原文地址:https://www.cnblogs.com/mingforyou/p/2288695.html
Copyright © 2011-2022 走看看