文档章节

每天一个设计模式之(14)-----组合模式

SamrtLamb
 SamrtLamb
发布于 2017/07/21 11:19
字数 417
阅读 2
收藏 0

1.为什么要使用组合模式

    组合模式其实就是一种树形的数据结构,在接口/抽象类中定义一个方法,不论是根节点,还是树枝结点还是叶子结点,都可以直接调用,形成了一种“部分-整体”的结构。

2.看一下类图

    Component是抽象类,有自己的名字,并定义了获取自己孩子结点的方法,并实现了display的方法,Composite是根节点和数枝结点的实现,Leaf是叶子结点的实现

3.实现

    抽象类

public abstract class Component {

    private String name;

    public String getName() {
        return name;
    }

    public Component(String name) {
        this.name = name;
    }


    abstract List<Component> getChildren();

    abstract void setChildren(List<Component> children);

    //最重要的是这个方法
    void display(){
        System.out.println(this.name);
        if(null != getChildren()){
            for (Component component : getChildren()){
                component.display();//递归打印
            }
        }
    }
}

    Composite和Leaf

public class Composite extends Component{

    private List<Component> children;

    public Composite(String name) {
        super(name);
    }

    public void setChildren(List<Component> children) {
        this.children = children;
    }

    @Override
    public List<Component> getChildren() {
        return children;
    }

}




public class Leaf extends Component{
    public Leaf(String name) {
        super(name);
    }

    @Override
    List<Component> getChildren() {
        return null;
    }

    @Override
    void setChildren(List<Component> children) {
        //空方法
    }

}

    main方法


/**
 * Created by hr on 2017/07/21.
 * 组合模式
 */
public class Main {

    public static void main(String[] args) {
        //设置根节点
        Component root = new Composite("root");

        //设置树枝节点
        Component branch1 = new Composite("branch1");
        Component branch2 = new Composite("branch2");
        List<Component> branches = new ArrayList<>();
        branches.add(branch1);
        branches.add(branch2);


        //设置叶子结点
        Component leaf1 = new Leaf("leaf1");
        Component leaf2 = new Leaf("leaf2");
        Component leaf3 = new Leaf("leaf3");
        List<Component> leaves = new ArrayList<>();
        leaves.add(leaf1);
        leaves.add(leaf2);
        leaves.add(leaf3);

        //组建成树
        root.setChildren(branches);
        branch1.setChildren(leaves);

        //打印树
        System.out.println("=========打印整颗树========");
        root.display();

        //或者打印一个树枝
        System.out.println("=========打印branch1======");
        branch1.display();
    }
}

//输出结果
=========打印整颗树========
root
branch1
leaf1
leaf2
leaf3
branch2
=========打印branch1======
branch1
leaf1
leaf2
leaf3

 

© 著作权归作者所有

SamrtLamb
粉丝 0
博文 28
码字总数 19760
作品 0
杭州
私信 提问
Java经典设计模式(2):七大结构型模式

总体来说设计模式分为三大类:创建型模式、结构型模式和行为型模式。 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则。设计模式的六大原则是设计模...

飓风2000
2017/02/10
5
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
2018/05/26
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
279
0
JavaScript设计模式总结

之前看过《JavaScript设计模式与开发实践》这本书,对书中的设计模式和一些相关案例也有了一定的了解,同时把这些设计模式的应用对应在在一些其他的项目中,进行了一些整理,如下仅供参考: ...

jefferyE
03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
22分钟前
6
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
37分钟前
6
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
375
8
玩转 Springboot 2 之热部署(DevTools)

Devtools 介绍 SpringBoot 提供了热部署的功能,那啥是热部署累?SpringBoot官方是这样说的:只要类路径上的文件发生更改,就会自动重新启动应用程序。在IDE中工作时,这可能是一个有用的功能...

桌前明月
今天
5
0
CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部