`
chjavach
  • 浏览: 460982 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

研磨设计模式 之 组合模式(Composite) 1——跟着cc学设计系列

阅读更多

15.1  场景问题

15.1.1  商品类别树

       考虑这样一个实际的应用:管理商品类别树。

在实现跟商品有关的应用系统的时候,一个很常见的功能就是商品类别树的管理,比如有如下所示的商品类别树:

+服装

+男装

                                -衬衣

                                -夹克

                            +女装

                                -裙子

                                -套装

       仔细观察上面的商品类别树,有以下几个明显的特点:

  • 有一个根节点,比如服装,它没有父节点,它可以包含其它的节点
  • 树枝节点,有一类节点可以包含其它的节点,称之为树枝节点,比如男装、女装
  • 叶子节点,有一类节点没有子节点,称之为叶子节点,比如衬衣、夹克、裙子、套装

现在需要管理商品类别树,假如就要求能实现输出如上商品类别树的结构的功能,应该如何实现呢?

15.1.2  不用模式的解决方案

       要管理商品类别树,就是要管理树的各个节点,现在树上的节点有三类,根节点、树枝节点和叶子节点,再进一步分析发现,根节点和树枝节点是类似的,都是可以包含其它节点的节点,把它们称为容器节点。

       这样一来,商品类别树的节点就被分成了两种,一种是容器节点,另一种是叶子节点。容器节点可以包含其它的容器节点或者叶子节点。把它们分别实现成为对象,也就是容器对象和叶子对象,容器对象可以包含其它的容器对象或者叶子对象,换句话说,容器对象是一种组合对象。

然后在组合对象和叶子对象里面去实现要求的功能就可以了,看看代码实现。

(1)先看叶子对象的代码实现,示例代码如下:

/**

 * 叶子对象

 */

public class Leaf {

    /**

     * 叶子对象的名字

     */

    private String name = "";

 

    /**

     * 构造方法,传入叶子对象的名字

     * @param name 叶子对象的名字

     */

    public Leaf(String name){

       this.name = name;

    }

 

    /**

     * 输出叶子对象的结构,叶子对象没有子对象,也就是输出叶子对象的名字

     * @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进

     */

    public void printStruct(String preStr){

       System.out.println(preStr+"-"+name);

    }

}

(2)再来看看组合对象的代码实现,组合对象里面可以包含其它的组合对象或者是叶子对象,由于类型不一样,需要分开记录。示例代码如下:

/**

 * 组合对象,可以包含其它组合对象或者叶子对象

 */

public class Composite {

    /**

     * 用来记录包含的其它组合对象

     */

    private Collection<Composite> childComposite =

new ArrayList<Composite>();

    /**

     * 用来记录包含的其它叶子对象

     */

    private Collection<Leaf> childLeaf = new ArrayList<Leaf>();

    /**

     * 组合对象的名字

     */

    private String name = "";

 

    /**

     * 构造方法,传入组合对象的名字

     * @param name 组合对象的名字

     */

    public Composite(String name){

       this.name = name;

    }

 

    /**

     * 向组合对象加入被它包含的其它组合对象

     * @param c 被它包含的其它组合对象

     */

    public void addComposite(Composite c){

       this.childComposite.add(c);

    }

    /**

     * 向组合对象加入被它包含的叶子对象

     * @param leaf 被它包含的叶子对象

     */

    public void addLeaf(Leaf leaf){

       this.childLeaf.add(leaf);

    }

    /**

     * 输出组合对象自身的结构

     * @param preStr 前缀,主要是按照层级拼接的空格,实现向后缩进

     */

    public void printStruct(String preStr){

       //先把自己输出去

       System.out.println(preStr+"+"+this.name);

       //然后添加一个空格,表示向后缩进一个空格,输出自己包含的叶子对象

       preStr+=" ";

       for(Leaf leaf : childLeaf){

           leaf.printStruct(preStr);

       }

       //输出当前对象的子对象了

       for(Composite c : childComposite){

           //递归输出每个子对象

           c.printStruct(preStr);

       }

    }

}

(3)写个客户端来测试一下,看看是否能实现要求的功能,示例代码如下:

public class Client {

    public static void main(String[] args) {

       //定义所有的组合对象

       Composite root = new Composite("服装");

       Composite c1 = new Composite("男装");

       Composite c2 = new Composite("女装");

 

       //定义所有的叶子对象

       Leaf leaf1 = new Leaf("衬衣");

       Leaf leaf2 = new Leaf("夹克");

       Leaf leaf3 = new Leaf("裙子");

       Leaf leaf4 = new Leaf("套装");

 

       //按照树的结构来组合组合对象和叶子对象

       root.addComposite(c1);

       root.addComposite(c2);     

       c1.addLeaf(leaf1);

       c1.addLeaf(leaf2);      

       c2.addLeaf(leaf3);

       c2.addLeaf(leaf4);      

 

       //调用根对象的输出功能来输出整棵树

       root.printStruct("");

    }

}

运行一下,测试看看,是否能完成要求的功能。

15.1.3  有何问题

上面的实现,虽然能实现要求的功能,但是有一个很明显的问题:那就是必须区分组合对象和叶子对象,并进行有区别的对待,比如在Composite和Client里面,都需要去区别对待这两种对象。

区别对待组合对象和叶子对象,不仅让程序变得复杂,还对功能的扩展也带来不便。实际上,大多数情况下用户并不想要去区别它们,而是认为它们是一样的,这样他们操作起来最简单。

换句话说,对于这种具有整体与部分关系,并能组合成树形结构的对象结构,如何才能够以一个统一的方式来进行操作呢?

 

---------------------------------------------------------------------------

私塾在线学习网原创内容  跟着cc学设计系列 之 研磨设计模式

研磨设计讨论群【252780326】

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/5511.html

---------------------------------------------------------------------------

1
5
分享到:
评论

相关推荐

    研磨设计模式(完整带书签).part2.pdf

    第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式...

    研磨设计模式源码

    研磨设计模式的配套源码,请下载,不要想了,解压后,直接放到eclipse下面即可运行!

    研磨设计模式带书签完整版228M.7z.001

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式 完美书签 完整(一)

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整带书签).part1.pdf

    第15章 组合模式(Composite) 第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式...

    研磨设计模式带书签完整版228M.7z.002

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整版pdf) part1 (1-3)

    研磨设计模式(完整版pdf)相信我不用介绍,很多人都在找这本书吧,今天我特意从另外的地方下载到了这本书,发了几十积分。才弄到。为了让大家同时分享这本书的精华。我今天特意上传。注:此电子书较大,我分了3个...

    研磨设计模式-陈臣.epub

    “1.1 设计模式是什么 1.1.1 什么是模式 ...1.设计模式是解决方案 根据上面对设计模式的定义可以看出,归根结底,设计模式就是一些解决方案。” 摘录来自: 陈臣. “研磨设计模式”。 iBooks.

    研磨设计模式PDF

    研磨设计模式PDF

    研磨设计模式视频课程PPT

    内容概述:本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制 课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力 ...

    研磨设计模式高清完整版(1)

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-陈臣.王斌.扫描高清版PDF

    设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;...

    研磨设计模式带书签完整版228M.7z.003

    研磨设计模式《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地...

    研磨设计模式书-配套源代码(全)

    0该书是《研磨设计模式》,只有前几张,网上完整版电子书还没有,这是本人收集的最完备的,最多的前几章。 1:本源代码是《研磨设计模式》一书的配套源代码 2:每个模式的示例源代码放在一个单独的文件夹下,以该...

    研磨设计模式-陈臣pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式 PDF ZIP.001(三个压缩包)

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整版pdf)part2 (2-3)

    研磨设计模式(完整版pdf)相信我不用介绍,很多人都在找这本书吧,今天我特意从另外的地方下载到了这本书,发了几十积分。才弄到。为了让大家同时分享这本书的精华。我今天特意上传。注:此电子书较大,我分了3个...

    研磨设计模式高清完整版(2)

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-陈臣.mobi kindle版

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整版pdf)part3 (3-3)

    研磨设计模式(完整版pdf)相信我不用介绍,很多人都在找这本书吧,今天我特意从另外的地方下载到了这本书,发了几十积分。才弄到。为了让大家同时分享这本书的精华。我今天特意上传。注:此电子书较大,我分了3个...

Global site tag (gtag.js) - Google Analytics