设计模式10-结构型设计模式-组合设计模式

组合模式是一种设计模式,用于表示对象的整体-部分关系,简化客户端对单个对象和组合对象的处理。它通过将对象组织成树形结构,使得添加新对象变得容易,同时保持代码的整洁。在场景如地区区域分级表示中,组合模式能清晰地展示层次结构。该模式的优点包括统一的接口处理、易于扩展,但可能增加理解和限制构件的复杂性。适用场景包括需要表示层次结构和隐藏组合对象与单个对象差异的场合。
摘要由CSDN通过智能技术生成

编程是一门艺术,大批量的改动显然是非常丑陋的做法,用心的琢磨写的代码让它变的更美观。

在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包等。

在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。

1.组合设计模式定义

组合(Composite Pattern)设计模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性。

组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点。

2.组合设计模式的优点与不足

组合模式的主要优点有:

  • 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;

  • 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

其主要不足是:

  • 设计较复杂,客户端需要花更多时间理清类之间的层次关系;

  • 不容易限制容器中的构件;

  • 不容易用继承的方法来增加构件的新功能;

3.组合模式的实现思路

组合模式包含以下主要角色:

  • 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)

  • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。

  • 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

4.组合设计模式代码示例

场景介绍:将地区区域分级表示,使用其他的方式很难将层次结构表达清楚,使用组合设计模式就非常方便。

public abstract class Node {

    private String name;

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

    /**
     * 获取子节点
     * @return
     */
    public abstract List<Node> getChildren();

    public String getName() {
        return name;
    }

}

/**
 * 叶子节点
 */
public class LeafNode extends Node{
    public LeafNode(String name) {
        super(name);
    }

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

/**
 * 区节点
 */
public class DistrictNode extends Node{

    private List<Node> children = new ArrayList<>();

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

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

    public void addChild(Node node){
        children.add(node);
    }

    public void delChild(int i){
        children.remove(i);
    }
}

 public static void main(String[] args) {
        //根目录
        DistrictNode root = new DistrictNode("root");

        //一线目录
        root.addChild(new DistrictNode("shang hai"));
        root.addChild(new DistrictNode("tian jin"));
        DistrictNode districtNode = new DistrictNode("bei jing");
        root.addChild(districtNode);

        //二级目录
        districtNode.addChild(new DistrictNode("hai dian qu"));
        districtNode.addChild(new DistrictNode("xi cheng qu"));
        DistrictNode districtNode2 = new DistrictNode("chao yang qu");
        districtNode.addChild(districtNode2);

        //三级目录
        districtNode2.addChild(new LeafNode("san li tun "));
        districtNode2.addChild(new LeafNode("guo mao"));

        System.out.println(JsonOutput.toJson(root));

    }

使用组合模式,很清晰的将分层的数据进行组织,以后遇到类似这样的数据,可以采用这个方式处理。

5.组合设计模式应用场景

前面分析了组合模式的结构与特点,下面分析它适用的以下应用场景。

  • 在需要表示一个对象整体与部分的层次结构的场合。

  • 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值