码迷,mamicode.com
首页 > 其他好文 > 详细

组合设计模式

时间:2019-03-07 17:52:31      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:大话设计模式   override   xtend   oid   auto   层次结构   load   部分   display   

概述

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
设计模式可以分为三大类,分别是创建型、结构型和行为型。

结构型

组合模式(composite)

将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

结构图

技术图片

应用场景

拥有部分和整体的场景,例如,文件和文件夹,树形菜单。

优点

高层代码调用简单;节点可以自由增加

缺点

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

代码

顶层接口

public abstract class Component {
    protected  String name;
    public Component(String name){
        this.name = name;
    }
    public abstract void add(Component c);
    public abstract void remove(Component c);
    public abstract void display(int depth);

}

叶子节点

public class Leaf extends Component{

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

    @Override
    public void add(Component c) {
        System.out.println("Cannot add a leaf");
    }

    @Override
    public void remove(Component c) {
        System.out.println("Cannot remove from a leaf");
    }

    @Override
    public void display(int depth) {
        String str = "";
        for (int i=0; i<depth; i++){
            str = str + "-";
        }
        System.out.println(str + name);
    }
}

节点 相当于枝干,可以存储更多节点

public class Composite extends Component{

    public Composite(String name){
        super(name);
    }
    private List<Component> children = new ArrayList<>();

    @Override
    public void add(Component c) {
        children.add(c);
    }

    @Override
    public void remove(Component c) {
        children.remove(c);
    }

    @Override
    public void display(int depth) {
        String str = "";
        for (int i=0; i<depth; i++){
            str = str + "-";
        }
        System.out.println(str + name);
        for (Component component : children){
            component.display(depth + 2);
        }
    }

主类测试

public class JavaDemo {
    public static void main(String[] args){
        Composite root = new Composite("root");
        root.add(new Leaf("Leaf A"));
        root.add(new Leaf("Leaf B"));

        Composite cmp = new Composite("Composite X");
        cmp.add(new Leaf("Leaf XA"));
        cmp.add(new Leaf("Leaf XB"));

        root.add(cmp);
        root.display(1);
    }
}

注:

本文参考了书籍《大话设计模式》和菜鸟教程设计模式相关部分资料

组合设计模式

标签:大话设计模式   override   xtend   oid   auto   层次结构   load   部分   display   

原文地址:https://www.cnblogs.com/helloDuo/p/10490992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!