当前位置: 七九推 > IT编程>软件设计>设计模式 > HeadFirst设计模式-组合模式

HeadFirst设计模式-组合模式

2022年09月14日 设计模式 我要评论
定义 组合模式,允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。 实例 继续以餐厅和煎饼屋合并的例子为例。 前面说到࿰

定义

组合模式,允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

实例

继续以餐厅和煎饼屋合并的例子为例。

前面说到,餐厅菜单用ArrayList实现,煎饼屋菜单用数组,合并后两个都不想改变自己的实现,那么我们通过迭代器模式,统一了这两种实现,完成菜单遍历功能。

现在,餐厅需要在菜单上加个小菜单,甜品菜单。它包含在餐厅菜单里,所以无法用迭代器模式完成。那么,试试组合模式。将甜品菜单看做是组件,组合到餐厅菜单中。

餐厅菜单和甜品菜单都继承MenuComponent抽象类,即菜单组件:

public abstract class MenuComponent {
    public void add(MenuComponent menuComponent) {
        
    }
    
    public void remove(MenuComponent menuComponent) {
        
    }
    
    public MenuComponent getChild(int i) {
        
    }
    
    public String getName() {
        
    }
    
    public void print() {
        
    }
}

实现菜单项,这是组合类图里的叶类,它实现组合内元素的行为。代码如下:

public class MenuItem extends MenuComponent {
    String name;
    
    public MenuItem(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void print() {
        System.out.println(" " + getName());
    }
}

实现组合菜单,此组合类可以持有菜单项或其它菜单。代码如下:

public class Menu extends MenuComponent {
    ArrayList menuComponents = new ArrayList();
    String name;
    
    public Menu(String name) {
        this.name = name;
    }
    
    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }
    
    public void remoce(MenuComponent menuComponent) {
        menuComponents.remove(menuComponent);
    }
    
    public MenuComponent getChild(int i) {
        return (MenuComponent)menuComponents.get(i);
    }
    
    public String getName() {
        return name;
    }
    
    public void print() {
        System.out.println("\n" + getName());
        // 通过迭代器遍历所有菜单组件。
        // 遍历过程中,可能遇到其它菜单,或者是遇到菜单项。
        // 如果遇到另一个菜单对象,它的print()方法会开始另一个遍历,依次类推。
        // 由于菜单和菜单项都实现了print(),那我们只要调用print()即可。
        Iterator iterator = menuComponents.iterator();
        while(iterator.hasNext()) {
            MenuComponent menuComponent = (MenuComponent)iterator.next();
            menuComponent.print();
        }
    }
    
}

小结

  1. 组合模式提供一个结构,可同时包容个别对象和组合对象。

  2. 组合模式允许客户对个人对象以及组合对象一视同仁。

  3. 组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。

  4. 在实现组合模式时,有许多设计上的折中。你要根据需要平衡透明性和安全性。

(0)
打赏 微信扫一扫 微信扫一扫

相关文章:

  • 软件开发基础之设计模式概述

    软件开发基础之设计模式概述

    成为一名优秀的软件开发工程师,设计模式的重要性不言而喻,本章节是对设计模式的前置知识概述,涉及概念性较大,读者可在设计模式学习过程中参阅本文档。在第一章节,主要... [阅读全文]
  • Junit单元测试

    Junit单元测试

    Junit 1 Junit是什么 JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 ... [阅读全文]
  • 关于InstantiationException错误的原因

    关于InstantiationException错误的原因

    could not initialization Dammanage:com.ibatis.dao.client.DaoException: Errorwhil... [阅读全文]
  • 详解Go语言设计模式之单例模式

    详解Go语言设计模式之单例模式

    单例模式的概念单例模式很容易记住。就像名称一样,它只能提供对象的单一实例,保证一个类只有一个实例,并提供一个全局访问该实例的方法。在第一次调用该实例时被创建,然... [阅读全文]
  • pytorch dataset实战案例之读取数据集的代码

    pytorch dataset实战案例之读取数据集的代码

    概述最近在跑一篇图像修复论文的代码,配置好环境之后开始运行,发现数据一直加载不进去。害,还是得看人家代码咋写的,一句一句看逻辑,准能找出问题。通读dataset... [阅读全文]
  • Visitor设计模式及发送pod创建请求实现详解

    Visitor设计模式及发送pod创建请求实现详解

    确立目标理解kubectl的核心实现之一:visitor design pattern访问者模式理解发送pod创建请求的细节visitor design pat... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2023  七九推 保留所有权利. 粤ICP备17035492号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com