博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Composite (组合模式)
阅读量:6983 次
发布时间:2019-06-27

本文共 1960 字,大约阅读时间需要 6 分钟。

定义:允许你将对象组合成树型结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理 个别对象 以及 对象组合。

 

角色:

1) 抽象构建角色 (Component)

2) 叶子节点角色 (Leaf)

3) 组合构建角色 (Composite)

4) 客户端 (Client)

 

Component.java

 

[java]
  
  1. package com.composite ;  
  2.   
  3. import java.util.List ;  
  4.   
  5. //抽象构件角色  
  6. public interface Component  
  7.   
  8. {  
  9.       public void add (Component component) ;  
  10.   
  11.       public void remove (Component component) ;  
  12.   
  13.       public void doSomeThing () ;  
  14.   
  15.       public List<Component> getAll () ;  
  16.   
  17. }  

 

 

 

Leaf.java

 

[java]
  
  1. package com.composite ;   
  2.   
  3. import java.util.List ;  
  4.   
  5. //叶子角色  
  6. public class Leaf implements Component  
  7.   
  8. {  
  9.     public void add (Component component)  
  10.     {  
  11.   
  12.     }  
  13.     public void remove (Component component)  
  14.     {  
  15.   
  16.     }  
  17.        
  18.     public List<Component> getAll ()   
  19.     {  
  20.         return null ;  
  21.     }  
  22.   
  23.     public void doSomeThing ()   
  24.     {  
  25.   
  26.         System.out.println("hello") ;  
  27.   
  28.     }  
  29.   
  30. }  

 

 

Composite.java

 

[java]
  
  1. package com.composite ;  
  2.   
  3. import java.util.List ;  
  4. import java.util.ArrayList ;  
  5.   
  6. //组合角色  
  7. public class Composite implements Component  
  8.   
  9. {  
  10.     private List<Component> list = new ArrayList<Component> () ;  
  11.   
  12.     public void add (Component component)  
  13.     {  
  14.          list.add(component) ;  
  15.     }  
  16.   
  17.     public void remove (Component component)  
  18.     {  
  19.   
  20.          list.remove(component) ;  
  21.   
  22.     }  
  23.   
  24.     public List<Component> getAll ()   
  25.     {  
  26.           return this.list ;  
  27.   
  28.     }  
  29.   
  30.     //隐式递归  如果 遍历后发现component是叶子节点,则打印;反之,隐式递归  
  31.   
  32.     public void doSomeThing ()   
  33.     {  
  34.         for (Component component : list)  
  35.         {  
  36.             component.doSomeThing() ;     
  37.   
  38.         }  
  39.   
  40.      }  
  41.    
  42.   
  43. }  

 

 

Client.java

 

[java]
  
  1. package com.composite ;  
  2.   
  3. //客户端角色  
  4. public class Client  
  5. {  
  6.     public static void main(String[] args)  
  7.     {  
  8.         //创建两个叶子构件  
  9.   
  10.         Component leaf1 = new Leaf () ;  
  11.   
  12.         Component leaf2 = new Leaf () ;  
  13.   
  14.         //创建一个组合构件  
  15.         Component com1 = new Composite () ;  
  16.   
  17.         com1.add (leaf1) ;  
  18.   
  19.         com1.add (leaf2) ;  
  20.           
  21.         //创建两个叶子构件  
  22.         Component leaf3 = new Leaf () ;  
  23.   
  24.         Component leaf4 = new Leaf () ;  
  25.           
  26.         //创建一个组合构件  
  27.         Component com2 = new Composite () ;  
  28.           
  29.         //把第一个组件装进第二个组件里  
  30.         com2.add (com1) ;  
  31.   
  32.         com2.add (leaf3) ;  
  33.   
  34.         com2.add (leaf4) ;             
  35.           
  36.         com2.doSomeThing () ;  
  37.           
  38.         //com2.remove(com1) ;  
  39.         //com2.remove(leaf2) ;//在这移除不掉leaf2,只能com1.remove(leaf2)  
  40.         //System.out.println(com2.getAll()) ;  
  41.   
  42.         }  
  43.   
  44.   
  45. }  

 

总结:

优点:

组合模式(Composite)可以让客户端的代码变的简单,不会那么繁琐,一致性的处理单个对象和组合对象

使用组合模式可以很好的增加新的叶子构件

 

缺点:

控制树枝节点构件不容易

转载地址:http://ajtpl.baihongyu.com/

你可能感兴趣的文章
十分钟熟练Dockerfile指令
查看>>
ES6新特征总结与介绍——声明与表达式
查看>>
python3实现抓取网页资源的 N 种方法(内附200GPython学习资料)
查看>>
自定义网络请求框架
查看>>
Unity(射线)
查看>>
阿里云媒体转码MTS使用教程
查看>>
shell常见的文件属性检查
查看>>
年度最期待游戏废土2登陆Linux
查看>>
CA knowledge study
查看>>
linux目录结构简析
查看>>
VMware ESXi部署OVF模板
查看>>
2上的svn部署
查看>>
《***测试实践指南》D03
查看>>
Site Definition和Web Template的区别
查看>>
细说linux挂载
查看>>
阿里资深系统架构师九峰谈云计算
查看>>
Android的多任务之路
查看>>
Autochk program not found - skipping auocheck
查看>>
☆聊聊Spring系列_Index
查看>>
我的友情链接
查看>>