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. 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。
  • 相关阅读:
    CVSps 3.8 发布,CVS 资料库更改收集
    Cobra WinLDTP 3.0 发布,GUI 自动化测试
    SolusOS 2 Alpha 6 发布,桌面 Linux 发行
    微软 Windows Phone 8 原创应用大赛起航
    JAVA削足适履适应RESTful设计
    如何撰写编程书籍
    Synbak 2.1 发布,系统备份工具
    LibreOffice 4.0 RC1 发布,支持火狐兼容主题
    Rails 3.2.11 发布,修复关键安全问题
    haveged 1.7 发布,随机数生成器
  • 原文地址:https://www.cnblogs.com/loveer/p/11279099.html
Copyright © 2011-2022 走看看