文档章节

每天一个设计模式之(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
杭州
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
Java 设计模式(14) —— 复合模式

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

磊_lei
05/26
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
05/18
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
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

play framework 如何支持多数据源

有段时间没有写博客了,但今天又写一篇了,主要是因为这事有一丝自己的思考和动手实践,所以就记录下来了。 现有的问题: play 1.2.4 两台数据库服务器,但是play1.2.4 并不支持同时连接两台...

tuerqidi
13分钟前
0
0
Mysql only_full_group_by解析

查看当前数据库模式: select @@sql_mode; 原因: mysql 5.7中的sql_mode的值中包含'ONLY_FULL_GROUP_BY'; 处理:执行以下SQL set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,N......

bug_404
15分钟前
0
0
防止表单重复提交

1:前端方式(治标不治本) $("#admin-role-save").click(function(){//admin-role-save为submit的idvar ts=$(this);var ts_old_val=ts.val();ts.val("提交中....");ts.att...

uug
15分钟前
0
0
保持屏幕常亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 在act的created方法中调用即可,一般是播放视频的时候......

Carbenson
15分钟前
0
0
智能合约实施指南

与区块链技术一样,智能合约在商业领域也非常有价值。 为了让我们的读者彻底了解智能合约是什么以及它们如何影响现代商业的交易方式,我们准备了本指南。 集中商业模式正在给去中心化的模式让...

geek12345
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部