前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >组合模式

组合模式

作者头像
用户1148394
发布2018-01-09 16:41:12
8680
发布2018-01-09 16:41:12
举报
文章被收录于专栏:余林丰余林丰

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

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

组合模式的UML类图结构:

image.png
image.png

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

公共抽象类Component:

代码语言:javascript
复制
 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 }    

组件类:

代码语言:javascript
复制
 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,仔细思考。

代码语言:javascript
复制
 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 }

客户端测试代码:

代码语言:javascript
复制
 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 }

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档