• GoF23种设计模式之结构型模式之组合模式


    一、概述

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

    二、适用性

    1.你想表示对象的部分--整体层次结构的时候。

    2.你希望用户忽略组合对象与单个对象的不同的时候,用户将统一地使用组合结构中的所有对象。

    三、参与者

    1.Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并且在适当的情况下实现它。

    2.Leaf:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义节点对象的行为。

    3.Composite:定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。

    4.Client:通过Component接口操作组合部件的对象。

    四、类图

    五、示例

    Component

    [java] view plain copy
     
     print?
    1. package cn.lynn.composite;  
    2.   
    3. import java.util.List;  
    4.   
    5. public abstract class Saint {  
    6.   
    7.     private String name;  
    8.       
    9.     protected List<Saint> saints;  
    10.       
    11.     public List<Saint> getSaints() {  
    12.         return saints;  
    13.     }  
    14.   
    15.     public String getName() {  
    16.         return name;  
    17.     }  
    18.   
    19.     public void setName(String name) {  
    20.         this.name = name;  
    21.     }  
    22.       
    23.     public void printInfo() {  
    24.         System.out.println(name);  
    25.     }  
    26.       
    27.     protected abstract void obtain(Saint saint);  
    28.       
    29.     protected abstract void deprive(Saint saint);  
    30.   
    31. }  

    Leaf

    [java] view plain copy
     
     print?
    1. package cn.lynn.composite;  
    2.   
    3. public class BronzeSaint extends Saint {  
    4.   
    5.     public BronzeSaint(String name) {  
    6.         super.setName(name);  
    7.         super.saints = null; // 青铜圣斗士已经是最低级的  
    8.     }  
    9.   
    10.     @Override  
    11.     public void obtain(Saint saint) {  
    12.   
    13.     }  
    14.   
    15.     @Override  
    16.     public void deprive(Saint saint) {  
    17.   
    18.     }  
    19.   
    20. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.composite;  
    2.   
    3. public class SilverSaint extends Saint {  
    4.   
    5.     public SilverSaint(String name) {  
    6.         super.setName(name);  
    7.         super.saints = null; // 白银圣斗士比青铜圣斗士强点  
    8.     }  
    9.   
    10.     @Override  
    11.     public void obtain(Saint saint) {  
    12.   
    13.     }  
    14.   
    15.     @Override  
    16.     public void deprive(Saint saint) {  
    17.   
    18.     }  
    19.   
    20. }  

    Composite

    [java] view plain copy
     
     print?
    1. package cn.lynn.composite;  
    2.   
    3. import java.util.ArrayList;  
    4.   
    5. public class GoldSaint extends Saint {  
    6.   
    7.     public GoldSaint(String name) {  
    8.         super.setName(name);  
    9.         super.saints = new ArrayList<Saint>(); // 还是黄金圣斗士牛逼,竟然会修圣衣  
    10.     }  
    11.   
    12.     @Override  
    13.     public void obtain(Saint saint) {  
    14.         super.saints.add(saint);  
    15.     }  
    16.   
    17.     @Override  
    18.     public void deprive(Saint saint) {  
    19.         super.saints.remove(saint);  
    20.     }  
    21.   
    22. }  

    Client

    [java] view plain copy
     
     print?
    1. package cn.lynn.composite;  
    2.   
    3. import java.util.List;  
    4.   
    5. public class Client {  
    6.   
    7.     public static void main(String[] args) {  
    8.         Saint goldSaint = new GoldSaint("穆先生");  
    9.         Saint silverSaint = new SilverSaint("魔铃");  
    10.         Saint bronzeSaint1 = new BronzeSaint("星矢");  
    11.         Saint bronzeSaint2 = new BronzeSaint("一辉");  
    12.         Saint bronzeSaint3 = new BronzeSaint("紫龙");  
    13.           
    14.         goldSaint.obtain(silverSaint);  
    15.         goldSaint.obtain(bronzeSaint1);  
    16.         goldSaint.obtain(bronzeSaint2);  
    17.         goldSaint.obtain(bronzeSaint3);  
    18.           
    19.         StringBuffer sb = new StringBuffer();  
    20.         sb.append(goldSaint.getName()+"指导");  
    21.         List<Saint> saints = goldSaint.getSaints();  
    22.         for (Saint saint : saints) {  
    23.             sb.append(saint.getName());  
    24.             sb.append("、");  
    25.         }  
    26.         sb = sb.deleteCharAt(sb.length() - 1);  
    27.         sb.append("修圣衣!");  
    28.         System.out.println(sb.toString());  
    29.     }  
    30.   
    31. }  

    Result

    [java] view plain copy
     
     print?
    1. 穆先生指导魔铃、星矢、一辉、紫龙修圣衣!  
  • 相关阅读:
    [51nod1384]全排列
    [51nod1256]乘法逆元
    [51nod1106]质数检测
    [51nod1058]求N!的长度
    2017 world final
    [Manacher+bit]Palindrome
    [hdu3068]最长回文(Manacher算法)
    [trie]字典树模板
    [凸包]Triangles
    LintCode-366.斐波纳契数
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471531.html
Copyright © 2020-2023  润新知