组合模式

在之前有接触过组合模式,那是第一次接触设计模式,觉得什么是组合模式啊?什么部分与整体。现在再来看组合模式,觉得实际上并没有那么神秘。

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。这句话什么意思呢?凡是能类似树形结构的场景,均可使用组合模式来实现。对组合对象和单个对象抽象为一个公共类,这样就使得对它们的使用一致了。

组合模式的UML类图结构:

image.png

任何复杂的代码其基本结构都是简单的,把简单的灵活应用组合起来就变得不简单。

公共抽象类Component:

 1 package day_8_composite;
 2 
 3 /**
 4  * 所有类共用接口的默认方法
 5  * @author turbo
 6  *
 7  * 2016年9月11日
 8  */
 9 public abstract class Component {
10     private String name;
11     
12     public Component(String name){
13         this.name = name;
14     }
15     
16     public String getName() {
17         return name;
18     }
19     public void setName(String name) {
20         this.name = name;
21     }
22     
23     public abstract void add(Component c);
24     public abstract void remove(Component c);
25     
26     /**
27      * 这里用来显示结构关系,可再抽象一个方法,每个实现子类具体实现
28      * @param c
29      */
30     public abstract void display();
31 }    

组件类:

 1 package day_8_composite;
 2 
 3 /**
 4  * 组件类。即叶节点,不具体实现add和remove方法。
 5  * @author turbo
 6  *
 7  * 2016年9月11日
 8  */
 9 public class Leaf extends Component {
10 
11     /**
12      * @param name
13      */
14     public Leaf(String name) {
15         super(name);
16     }
17 
18     /* (non-Javadoc)
19      * @see day_8_composite.Component#add(day_8_composite.Component)
20      */
21     @Override
22     public void add(Component c) {
23         // TODO Auto-generated method stub
24 
25     }
26 
27     /* (non-Javadoc)
28      * @see day_8_composite.Component#remove(day_8_composite.Component)
29      */
30     @Override
31     public void remove(Component c) {
32         // TODO Auto-generated method stub
33 
34     }
35 
36     /* (non-Javadoc)
37      * @see day_8_composite.Component#display(day_8_composite.Component)
38      */
39     @Override
40     public void display() {
41         System.out.println(super.getName());
42     }
43 
44 }

组合类,注意其中有一个list,为什么有list,仔细思考。

 1 package day_8_composite;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 /**
 7  * 组合类
 8  * @author turbo
 9  *
10  * 2016年9月11日
11  */
12 public class Composite extends Component {
13     
14     /**
15      * @param name
16      */
17     public Composite(String name) {
18         super(name);
19     }
20 
21     private List<Component> list = new ArrayList<Component>();
22     
23     /* (non-Javadoc)
24      * @see day_8_composite.Component#add(day_8_composite.Component)
25      */
26     @Override
27     public void add(Component c) {
28         list.add(c);
29     }
30 
31     /* (non-Javadoc)
32      * @see day_8_composite.Component#remove(day_8_composite.Component)
33      */
34     @Override
35     public void remove(Component c) {
36         list.remove(c);
37     }
38 
39     /* (non-Javadoc)
40      * @see day_8_composite.Component#display(int)
41      */
42     @Override
43     public void display() {
44         System.out.println(super.getName());
45         for (Component c : list){
46             c.display();
47         }
48     }
49 
50 }

客户端测试代码:

 1 package day_8_composite;
 2 
 3 /**
 4  * 客户端测试代码
 5  * @author turbo
 6  *
 7  * 2016年9月11日
 8  */
 9 public class Main {
10 
11     /**
12      * @param args
13      */
14     public static void main(String[] args) {
15         Composite root = new Composite("根节点");
16         /*构造左节点,右分支*/
17         Leaf leftLeaf = new Leaf("左节点");
18         Composite rightBranch = new Composite("右分支");
19         /*将左右节点分支挂到根节点*/
20         root.add(leftLeaf);
21         root.add(rightBranch);
22         /*为右分支添加节点*/
23         Leaf leaf1 = new Leaf("右-子节点1");
24         Leaf leaf2 = new Leaf("右-子节点2");
25         /*将节点挂到右分支上*/
26         rightBranch.add(leaf1);
27         rightBranch.add(leaf2);
28         
29         root.display();
30     }
31 
32 }

现在我们就实现了一个最基本的组合模式,上面说过,复杂的代码其实质就是灵活应用最简单的代码。虽然这里我们实现了组合模式,也看懂了组合模式,但离真正应用还有一段路要走,我之所以想要学这些设计模式并且写出来,实际上是在为阅读开源代码做准备,阅读开源框架的代码是很好的学习方式。无奈每次打开源代码都被各种各样“复杂”的接口、抽象类、实现类给绕晕,只好草草收场。与其说写的“复杂”,我想用写的好来形容更恰当,之所以看不懂是因为基础太弱。有了扎实的基础,才能走得更远。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多个构造器参数使用构建器

    标题一眼看过去可能不是很明白要讲什么,先来看看下面一段代码。 1 package example; 2 3 /** 4 * 重叠构造器 5 * ...

    用户1148394
  • Java线程安全性中的对象发布和逸出

    发布(Publish)和逸出(Escape)这两个概念倒是第一次听说,不过它在实际当中却十分常见,这和Java并发编程的线程安全性就很大的关系。 什么是发布?简...

    用户1148394
  • 14.Java中的Future模式

    jdk1.7.0_79   本文实际上是对上文《13.ThreadPoolExecutor线程池之submit方法》的一个延续或者一个补充。在上文中提到的su...

    用户1148394
  • CVPR 19系列3 | Stereo R-CNN 3D 目标检测

    之前在3D检测方面的文章层出不穷,也是各个公司无人驾驶或者机器人学部门关注的重点,包含了点云,点云图像融合,以及单目3D检测,但是在双目视觉方面的贡献还是比较少...

    计算机视觉研究院
  • CVPR 19系列 | Stereo R-CNN 3D 目标检测

    之前在3D检测方面的文章层出不穷,也是各个公司无人驾驶或者机器人学部门关注的重点,包含了点云,点云图像融合,以及单目3D检测,但是在双目视觉方面的贡献还是比较少...

    计算机视觉研究院
  • 从四个java源码构文件建一个机票预定业务的规则引擎(下篇)

    魏新宇
  • 从尾到头打印链表

    用户3003813
  • TypeScript 设计模式之观察者模式

    观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。

    阿宝哥
  • 3月15日数据动态早报|互联网金融升级2.0,银行进入智能投顾时代

    数据动态早报,让您了解数据新变化,新创造和新价值。 ? ---- 一、通信行业数据动态 1 华为与东方通联合发布经济运行监测平台 瞄准政务大数据经济的契机。...

    陆勤_数据人网
  • JS对象与Dom对象与jQuery对象之间的区别

    通过问题看本质: 举例: js的写法:document.getElementById('save').disabled=true; 在jquery中我是这...

    用户1195962

扫码关注云+社区

领取腾讯云代金券