设计模式之组合模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本人对于设计模式的学习,仅供参考!

一、组合模式Composite

简介:
将对象组合成树形行结构,以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
他使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式可以让你优化处理递归或分级数据结构。分级数据的一个普遍例子,如使用电脑时遇到的系统文件由文件夹和文件组成,文件夹中又可以包含文件夹。按这种方式文件系统就是以递归结构来组织的。想描述这样的结构就可以使用组合模式Composite。

在这里插入图片描述组合模式主要包含以下主要角色:
1.抽象构建角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现他们的默认行为。在透明式的组合模式中,抽象构建还声明访问和管理子类的接口。
2.树叶构建角色:是组合中的叶节点对象,他没有子节点,用于继承或实现抽象构建。
3.树枝结构角色:是组合中的分支节点对象,他有子节点(子节点可以是树叶构建、可以是树枝构建),用于继承或实现抽象构建。

二、代码实现

代码如下(示例):

//抽象构建角色
public interface Node {
   void desc();
}
//树枝结构角色
public class Branch implements Node {
    private String name;
    //子节点集合
    private List<Node>nodes=new ArrayList<>();
    public List<Node> getNodes() {
        return nodes;
    }
    public Branch(String name) {
        this.name = name;
    }
    //重写的业务代码
    @Override
    public void desc() {
        System.out.println(name);
    }
    public void add(Node n){
        this.nodes.add(n);
    }
}
//树叶构件角色
public class Leaf implements Node {
    private String content;
    public Leaf(String content) {
        this.content = content;
    }
    //重写的业务方法
    @Override
    public void desc() {
        System.out.println(content);
    }
}
public class Main {
    public static void main(String[] args) {
        /*构建树形节点的对象----------------------start----------------------*/
        Branch root=new Branch("root");
        Branch directory1=new Branch("d1");
        Branch directory11=new Branch("d11");
        Node file111=new Leaf("f111");
        Branch directory12=new Branch("d12");
        Node file121=new Leaf("f121");
        Node file13=new Leaf("f13");

        Branch directory2=new Branch("d2");
        Branch directory21=new Branch("d21");
        Node file211=new Leaf("f211");
        Branch directory22=new Branch("d22");
        Node file221=new Leaf("f221");
        Node file23=new Leaf("f23");

        Node file3=new Leaf("f3");


        directory2.add(directory22);
        directory2.add(directory21);
        directory2.add(file23);

        directory22.add(file221);
        directory21.add(file211);

        directory1.add(directory11);
        directory1.add(directory12);
        directory1.add(file13);
        directory11.add(file111);
        directory12.add(file121);

        root.add(directory1);
        root.add(directory2);
        root.add(file3);
        /*构建树形节点的对象----------------end-----------------------------*/

        tree(root,0);

    }
    static void tree(Node b,int depth){
        for (int i = 0; i < depth; i++) System.out.print("--");
        b.desc();
        if (b instanceof Branch){
            for (Node node : ((Branch)b).getNodes()) {
                tree(node,depth+1);
            }
        }
    }
}

控制台:

root
--d1
----d11
------f111
----d12
------f121
----f13
--d2
----d22
------f221
----d21
------f211
----f23
--f3

Process finished with exit code 0


总结

优点:
1.清楚的定义分层次的复杂对象,表示对象的全部或部分层次。
2.让客户端忽略层次之间的差异,方便对整个层次结构进行控制。
3.简化客户端代码
缺点:
1.限制类型是比较复杂。
2.使设计变得更加抽象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值