Java设计模式之组合模式的示例详解

目录
  • 定义
  • 原理类图
  • 案例
    • 需求
    • 方案
  • 分析
  • 总结

定义

组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性

原理类图

Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口

leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构

Composite:非叶子节点,下面仍然有分支,用来存储分支,实现了Component 定义的默认行为

案例

需求

商场的服装店,专卖店,衣服,裤子的关系

方案

定义组合模式的抽象构件

public abstract class Component {
    private String name;
    private String desc;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public Component(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public void add(Component component){
        throw new UnsupportedOperationException();
    }

    public void remove(Component component){
        throw new UnsupportedOperationException();
    }

    public abstract void show();
}

定义服装商铺类

public class Store extends Component{

    List<Component> componentList = new ArrayList<Component>();

    public Store(String name, String desc){
        super(name, desc);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDesc() {
        return super.getDesc();
    }

    @Override
    public void add(Component component) {
        System.out.println("添加:" + getName());
        componentList.add(component);
    }

    @Override
    public void remove(Component component) {
        System.out.println("移除:" + getName());
        componentList.remove(component);
    }

    @Override
    public void show() {
        for (Component component : componentList) {
            System.out.println(component.getName());
            component.show();
        }
    }
}

定义服装专卖店商铺

public class BrandStore extends Component{

    List<Component> componentList = new ArrayList<Component>();

    public BrandStore(String name, String desc) {
        super(name, desc);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDesc() {
        return super.getDesc();
    }

    @Override
    public void add(Component component) {
        componentList.add(component);
    }

    @Override
    public void remove(Component component) {
        componentList.remove(component);
    }

    @Override
    public void show() {
        for (Component component : componentList) {
            System.out.println(component.getName());
            component.show();
        }
    }
}

定义运动装

public class Sportswear extends Component{

    List<Component> componentList = new ArrayList<Component>();

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDesc() {
        return super.getDesc();
    }

    public Sportswear(String name, String desc) {
        super(name, desc);
    }

    @Override
    public void add(Component component) {
        componentList.add(component);
    }

    @Override
    public void remove(Component component) {
        componentList.remove(component);
    }

    @Override
    public void show() {
        for (Component component: componentList) {
            System.out.println(component.getName());
        }
    }
}

定义测试类

public class Test {
    public static void main(String[] args) {
        // 服装店
        Component store = new Store("服装店","服装店");

        // 专卖店
        Component brandStore1 = new BrandStore("李宁服装专卖店","李宁服装专卖店");
        Component brandStore2 = new BrandStore("361服装专卖店","361服装专卖店");

        // 运动装
        Component sportswear1 = new Sportswear("运动装","运动装");
        Component sportswear2 = new Sportswear("休闲装","休闲装");

        brandStore1.add(sportswear1);
        brandStore2.add(sportswear2);

        store.add(brandStore1);
        store.add(brandStore2);
        store.show();
    }
}

查看测试结果

分析

该案例中,服装店(Store),专卖店(BrandStore),运动装(Sportswear)都继承了抽象构件(Component),通过持有一个list来管理自身持有的对象,这样客户端就可以一致处理单个对象和组合对象,屏蔽了对象层次的差异性,这样的话,一致的行为就可以控制不同的层次了。

总结

优势

组合模式可以使得客户端代码可以一致的处理单个对象和组合对象,无须关心自己处理的是单个还是组合,屏蔽了对象系统的层次差异性,这样的话一致的行为就可以控制不同层次了

扩展性非常高,可以很方便的增加叶子节点和非叶子节点,并且对于现有的类库无侵入,满足开闭原则

劣势

如果说各个节点有很大差异的话,不适合使用组合模式

使用场景

处理树形结构,具备统一行为,建议大家使用组合模式

想体现对象的部分,整体结构的时候,可以使用组合模式,典型一点例如文件和文件夹

到此这篇关于Java设计模式之组合模式的示例详解的文章就介绍到这了,更多相关Java组合模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java设计模式-组合模式详解

    目录 组合模式 Demo 代码: 总结 组合模式 组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口. 何时使用:

  • Java设计模式:组合模式

    目录 概述 结构 组合模式案例 分析 总结 在本讲,我们来学习一下结构型模式里面的第六个设计模式,即组合模式. 概述 在学习组合模式之前,我们先来看下面这张图. 对于以上这张图大家应该很熟悉,我们可以将其看作是一个文件系统,其实说到底它就是Windows系统里面的一个目录结构,只不过对于Windows中的文件系统而言,它里面包含有C盘.D盘.E盘等等盘符,而这里我们只是以它里面的某一个盘符里面的目录结构为例来进行了一个描述. 对于这样的结构我们称之为树形结构.为啥叫树形结构呢?你看一下上图中的左

  • JAVA设计模式之组合模式原理与用法详解

    本文实例讲述了JAVA设计模式之组合模式.分享给大家供大家参考,具体如下: 组合(整体与部分关系)模式:将不同但是相关的对象组合成树形结构以实现"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. * 模式角色组成: 1.Component对象: 是组合中的对象接口,是所有类共有的接口.是用于统一定义整体中的部分. 2.Leaf对象: 整体中的部分,没有下一级. 3.Composite对象: 用来存储子部件,在Component接口中实现与部分有关操作. 以公司构成

  • Java设计模式之组合模式(Composite模式)介绍

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树形结构图.组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行.可以用牵一动百来形容. 所以Composite模式使用到Iterator模式,和Chain of Responsi

  • java设计模式之组合模式(Composite)

    概述 是一种结构型模式,将对象以树形结构组织起来,以表示"部分 - 整体"的层次结构,使得客户端对单个对象和组合对象的使用具有唯一性. UML类图 上面的类图包含的角色: Component:为参加组合的对象声明一个公共的接口,不管是组合还是叶节点. Leaf:在组合中表示叶子结点对象,叶子结点没有子结点. Composite:表示参加组合的有子对象的对象,并给出树枝构建的行为: 代码示例 import java.util.ArrayList; import java.util.Lis

  • Java设计模式之java组合模式详解

    目录 引言 组合模式介绍 角色 模式结构 示例代码 水果盘 文件浏览 更复杂的组合模式 透明与安全 透明组合模式 安全组合模式 组合模式总结 优点 缺点 适用场景 应用 XML文档解析 文件 HashMap Mybatis SqlNode中的组合模式 参考文章 总结 引言 树形结构不论在生活中或者是开发中都是一种非常常见的结构,一个容器对象(如文件夹)下可以存放多种不同的叶子对象或者容器对象,容器对象与叶子对象之间属性差别可能非常大. 由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中

  • 深入理解Java设计模式之组合模式

    目录 一.什么是组合模式 动机(Motivation) 意图(Intent) 二.组合模式的结构 结构图说明: 三.组合模式的使用场景 四.组合模式的优缺点 五.组合模式的实现 六.组合模式的.NET下应用 一.什么是组合模式 定义:将对象以树形结构组织起来,以达成"部分-整体"的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 动机(Motivation) 客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带

  • 快速理解Java设计模式中的组合模式

    组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系. 个人理解:组合模式就是将部分组装成整体. 定义如下: 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通用类图如下: 组合模式的包含角色: ● Component 抽象构件角色 定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. ● Leaf 叶子构件 叶子对象,其下再也没有其他的分支,也就是遍历的最

  • Java设计模式之组合模式的示例详解

    目录 定义 原理类图 案例 需求 方案 分析 总结 定义 组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性 原理类图 Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口 leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构 Composite

  • Java设计模式之建造者模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 建造者模式的优势: 注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象.建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可 以构建它们,用户不需要知道内部的具体构建细节. 案例 需求 女生每天化妆,假如只需要做发型,香水,衣服,并要求按照发型——>香水——>衣服的顺序进行,

  • Java设计模式之原型模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式 案例 需求 张三要打印100000份照片 方案一 定义照片类 /** * 照片类 * @author:liyajie * @createTime:2022/2/15 11:47 * @version:1.0 */ @Data @AllArgsConstructor publi

  • Java设计模式之桥接模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”. 案例 需求 通过企业微信和qq的方式给员工发送消息 方案一 定义发送消息的接口 /** * 发送消息的接口 * @author:liyajie * @createTime:2022/2/21 10:33

  • java设计模式责任链模式原理案例详解

    目录 引言 责任链模式定义 类图 角色 核心 示例代码 1.对请求处理者的抽象 2.对请求处理者的抽象 3.责任链的创建 责任链实现请假案例 案例类图 可扩展性 纯与不纯的责任链模式 纯的责任链模式 不纯的责任链模式 责任链模式主要优点 职责链模式的主要缺点 适用场景 模拟实现Tomcat中的过滤器机制 运行过程如下 分析Tomcat 过滤器中的责任链模式 引言 以请假流程为例,一般公司普通员工的请假流程简化如下: 普通员工发起一个请假申请,当请假天数小于3天时只需要得到主管批准即可:当请假天数

  • Java设计模式之状态模式State Pattern详解

    目录 概述 UML类图 状态模式与策略模式 谁决定状态转换的流向 State是接口还是抽象类 应用案例分析 状态抽象类 可以抽奖的状态 奖品发放完毕状态 发放奖品的状态 不能抽奖状态 抽奖活动(Context) 测试状态模式 概述 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.这个模式将状态封装成独立的类,并将动作委托到 代表当前状态的对象,我们知道行为会随着内部状态而改变. 一个对象“看起来好像修改了它的类”是什么意思呢?从客户的视角来看:如果说你使用的对象能够完全

  • Java设计模式之工厂模式实现方法详解

    本文实例讲述了Java设计模式之工厂模式实现方法.分享给大家供大家参考,具体如下: 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的 工厂模式在分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品: 一.简单工厂模式 简单工厂模式又称静态工厂方法模式

  • java设计模式策略模式图文示例详解

    目录 策略模式 意图 问题 解决方案 真实世界类比 策略模式结构 伪代码 策略模式适合应用场景 实现方式 策略模式优缺点 策略模式优缺点 与其他模式的关系 策略模式 亦称:Strategy 意图 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换. 问题 一天,你打算为游客们创建一款导游程序.该程序的核心功能是提供美观的地图,以帮助用户在任何城市中快速定位. 用户期待的程序新功能是自动路线规划:他们希望输入地址后就能在地图上看到前往目的

  • Java设计模式之责任链模式的示例详解

    目录 应用场景 实际代码案例 无模式情况下的代码 采用责任链模式优化代码 采用建造者+责任链模式优化代码 责任链模式优缺点 责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求位置,属于行为模式. 这里需要注意的是每个节点都能对对象进行一定的处理(也可以不处理),处理完成之后节点再进行判断还要进行后续处理还是说传递给下一个节点. 应用场景 首先举一个日常

随机推荐