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. 穆先生指导魔铃、星矢、一辉、紫龙修圣衣!  
原文地址:https://www.cnblogs.com/huangwentian/p/7471531.html