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

    概述
        将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,
        使用户对单个对象和组合对象具有一致的访问性。

    组合模式实现的最关键的地方是:

        简单对象和复合对象必须实现相同的接口。
        这就是组合模式能够将组合对象和简单对象进行一致处理的原因。



    抽象构件(Component)角色:

    它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
    树叶构件(Leaf)角色:
    是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中声明的公共接口。
    树枝构件(Composite)角色:
    是组合中的分支节点对象,它有子节点。
    它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,
    通常包含 Add()、Remove()、GetChild() 等方法。

    1.透明方式:
          在该方式中,由于抽象构件声明了所有子类中的全部方法
    所以客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。
    但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() 方法,
    却要实现它们(空实现或抛异常),这样会带来一些安全性问题。
     1 import java.util.ArrayList;
     2 
     3 public class Composit {
     4     public static void main(String[] args) {
     5         Composite one = new Composite();
     6         Composite two = new Composite();
     7         one.add(two);
     8         Leaf aa = new Leaf("夏明");
     9         Leaf bb = new Leaf("小红");
    10         Leaf cc = new Leaf("李华");
    11         one.add(aa);
    12         two.add(bb);
    13         two.add(cc);
    14         one.operation();
    15         two.operation();
    16     }
    17 }
    18 
    19 interface Component {
    20     public void add(Component c);
    21 
    22     public void remove(Component c);
    23 
    24     public Component getChild(int i);
    25 
    26     public void operation();
    27 }
    28 
    29 class Composite implements Component {
    30 
    31     private ArrayList<Component> st = new ArrayList<>();
    32 
    33     @Override
    34     public void add(Component c) {
    35         st.add(c);
    36     }
    37 
    38     @Override
    39     public void remove(Component c) {
    40         st.remove(c);
    41     }
    42 
    43     @Override
    44     public Component getChild(int i) {
    45         return st.get(i);
    46     }
    47 
    48     @Override
    49     public void operation() {
    50         for (int i = 0; i < st.size(); i++) {
    51             Component component = st.get(i);
    52             component.operation();
    53         }
    54     }
    55 }
    56 
    57 class Leaf implements Component {
    58 
    59     private String name;
    60 
    61     public Leaf(String name) {
    62         this.name = name;
    63     }
    64 
    65     @Override
    66     public void add(Component c) {
    67     }
    68 
    69     @Override
    70     public void remove(Component c) {
    71     }
    72 
    73     @Override
    74     public Component getChild(int i) {
    75         return null;
    76     }
    77 
    78     @Override
    79     public void operation() {
    80         System.out.println(name);
    81     }
    82 }

    2.安全式组合模式
      在Component中不去声明Add和Remove方法,

      那么子类的Leaf就不需要实现它,而是在Composit声明所有用来管理子类对象的方法。

     

    组合模式的使用场景

      在以下情况下应该考虑使用组合模式:

      1. 当想表达对象的部分-整体的层次结构时。
      2. 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。
  • 相关阅读:
    iaas,paas,saas理解
    July 06th. 2018, Week 27th. Friday
    July 05th. 2018, Week 27th. Thursday
    July 04th. 2018, Week 27th. Wednesday
    July 03rd. 2018, Week 27th. Tuesday
    July 02nd. 2018, Week 27th. Monday
    July 01st. 2018, Week 27th. Sunday
    June 30th. 2018, Week 26th. Saturday
    June 29th. 2018, Week 26th. Friday
    June 28th. 2018, Week 26th. Thursday
  • 原文地址:https://www.cnblogs.com/loveer/p/11279099.html
Copyright © 2011-2022 走看看