设计模式-装饰模式(Decorator)

2023-11-11

 

装饰模式又叫包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。

角色和职责:

1.抽象组件(Component)-Car:

   为统一接口,也是装饰类和被装饰类的统一接口

2.具体组件(concrete Component)-RunCar:

    抽象组件的具体实现

3.抽象装饰角色(Decorator)-Decorator:

    包含一个组件的引用,并定义了与抽象组件一致的接口

4.具体装饰(concrete Decorator)-FlyCarDecorator、SwimCarDecorator:

   负责具体的装饰

 

UML图:

具体代码如下:

/**
 * 汽车基类
 */
public interface Car {
    void run();
}
/**
 * 会跑的汽车
 */
public class RunCar implements Car{
    @Override
    public void run() {
        System.out.println("汽车会跑");
    }
}
/**
 * 装饰基类,实现和Car相同的方法
 */
public abstract class Decorator implements Car{
    protected Car car;
    public Decorator(Car car){
        this.car =car;
    }
}
/**
 * 会飞的汽车
 */
public class FlyCarDecorator extends Decorator{
    public FlyCarDecorator(Car car) {
        super(car);
    }

    @Override
    public void run() {
        this.car.run();
        this.run1();
    }

    private void run1(){
        System.out.println("还会飞");
    }
}
/**
 * 会游的汽车
 */
public class SwimCarDecorator extends Decorator{
    public SwimCarDecorator(Car car) {
        super(car);
    }

    @Override
    public void run() {
        this.car.run();
        this.run1();
    }

    private void run1(){
        System.out.println("还会游");
    }
}
public class Main {
    public static void main(String[] args) {
        Car runCar = new RunCar();//会跑的汽车
        runCar.run();
        System.out.println("----------------------------");

        Car flyRunCar = new FlyCarDecorator(runCar);//装饰会跑的汽车,变成会跑又会飞的汽车
        flyRunCar.run();
        System.out.println("----------------------");

        Car swimFlyRunCar = new SwimCarDecorator(flyRunCar);//装饰会跑会飞的汽车,变成会跑会飞会游的汽车
        swimFlyRunCar.run();
    }
}

结果:

汽车会跑
----------------------------
汽车会跑
还会飞
----------------------
汽车会跑
还会飞
还会游

 

具体源码:https://github.com/qjm201000/design_pattern_decorator.git

 

转载于:https://www.cnblogs.com/qjm201000/p/10061621.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式-装饰模式(Decorator) 的相关文章

  • 【网络通信】Netty面试专题之十大考问

    1 BIO NIO 和 AIO 的区别 BIO 一个连接一个线程 客户端有连接请求时服务器端就需要启动一个线程进行处理 线程开销大 伪异步 IO 将请求连接放入线程池 一对多 但线程还是很宝贵的资源 NIO 一个请求一个线程 但客户端发送的
  • 你知道this.$options吗?(Vue)

    题记 我们在Vue项目中会有很多情况下需要用到this options 所以接下来我们介绍几个场景会用到 options 我们想第一个问题当我们在template经常使用filter 那么你可以直接在methods里边用过滤器吗 我们在表单
  • GC 的三种基本实现方式

    GC 的三种基本实现方式 参考资料 代码的未来 作者 日 松本行弘 由于并非本人原著 我只是个 搬运工 SO 未经本人允许请尽情转载 另外个人像说明一下这里所说的GC指泛指垃圾回收机制 而单指Java或其他某种特定语言中的GC 可能具体语言
  • 【PTA】7-6 整除光棍

    7 6 整除光棍 这里所谓的 光棍 并不是指单身汪啦 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一
  • 设计模式-day02

    4 创建型模式 4 2 工厂模式 4 2 1 概述 需求 设计一个咖啡店点餐系统 设计一个咖啡类 Coffee 并定义其两个子类 美式咖啡 AmericanCoffee 和拿铁咖啡 LatteCoffee 再设计一个咖啡店类 CoffeeS
  • Ubuntu虚拟机和Windows实现文件拖拽复制粘贴

    方法 安装vm tools 1 在Ubuntu内部鼠标右键打开终端 2 更新apt get 一般新装的系统都需要更新apt get sudo apt get update ps 若无法更新 可以试着换一下镜像站 Ubuntu系统配置镜像站
  • Python基础系列2——Numpy数值计算及分析

    文章目录 1 实验内容 2 实验过程 2 1 numpy数组的建立 索引 计算 统计等 2 2 利用numpy对数据集 iris data 进行分析 3 实验结论及注意事项 1 实验内容 1 numpy数组的建立 索引 计算 统计等 2 利
  • BIOS和BootLoader uboot

    BIOS BIOS是英文 Basic Input Output System 的缩略语 直译过来后中文名称就是 基本输入输出系统 其实 它是一组固化到计算机内主板上一个ROM芯片上的程序 它保存着计算机最重要的基本输入输出的程序 系统设置信
  • Java Sort方法

    Java的sort方法就是排序 而且排的是升序 你要想降序可以先获得升序的 然后倒过来或者你重新写比较器Comparator的接口就可以 一 sort 排序方法本身 这里讲的sort方法 都是以Arrays类里面的方法为准 因为很多类的so
  • STM32 端口复用学习

    一 STM32端口复用 1 端口复用定义 STM32有很多的内置外设 这些外设的外部引脚都是与GPIO复用 也就是说 一个GPIO如果可以复用为内置外设的功能引脚 那么当这个GPIO作为内置外设使用的时候 就叫做复用 2 作用 最大限度的利
  • vue 实现计时器组件

    vue 实现计时器组件 结果图 v if 和 v show 的区别 总结来说v if是在不断的销毁和重建 v show 只是改变 display 属性 元素依然存在 dom 中 v if 切换开销大 v show 初始化开销大 time v
  • 人称代词用法大全

    语言发明出来自然是要给人用的 所以跟人相关的词就特别多 划分的很细 我们提到某个具体的人一般就直接说名字 但有时是泛指 或者前面已经提过名字了 后面用个啥简称指代下就清楚了 这就需要代词 代词嘛顾名思义是一个代称 是指代某个人或者某类人 某
  • 搭建使用 VS 开发 Qt 项目的环境

    搭建使用 VS 开发 Qt 项目的环境 个人认为 使用 Qt 工具开发 Qt 项目是最好的方案 在开发的过程出现的 bug 会比较少一些 但是有些同伴可能对 VS 比较钟爱 而 VS 又有此功能 因此想采用 VS 进行开发 本文将本人搭建成
  • nacos源码启动找不到istio包

    现象 源码版本2 1 0 启动时 编译不通过 报错 找不到 istio mcp v1alpha1 MetadataOuterClass Metadata istio networking v1alpha3 ServiceEntryOuter
  • 算法:链表

    单链表 单链表是一种链式存取的数据结构 链表中的数据是以结点来表示的 每个结点存储两个数据 一是该结点本身的值 二是其指向的下一结点的下标 用e i 表示节点i的值 用ne i 表示结点i指向的下一结点的坐标 head表示头结点的下标 id
  • 网关系统架构

    目录 一 API网关业务域 1 业务域 2 统一接入 3 安全防护 4 流量管控 5 协议转换 6 其他业务 1 接口文档管理 2 调试工具和示例 3 SDK自动生成能力 4 API增强 二 API网关核心指标 1 模型 2 安全性 3 高
  • C语言编写的简单计算器程序

    这两天在看一个C语言写的计算器程序 做了不少的功夫 跟着作者一步步的进行完善 了解了许多细节性的东西 在此自己做个总结 加深自己对程序的印象 也算是梳理 在该计算器程序 能进行加减乘除 sin cos exp等操作 同时能进行数值保存功能
  • 2021浙江工商计算机机试1

    1不在数列中的数字 给出一个长度为n的数列 包含1到n的数字 输出1到n中不在数列中的数字 include
  • Android studio64新建APP项目时,报错 junit:junit:4.12

    大家都是要求注释掉 但不想这样 看了很多博客 快绝望的时候 用这个办法成功了 文件 E android app 工程文件目录 下面的 build gradle 文件 在这个文件中加入最后划线3行 保存即可 然后再retry apply pl
  • VS安装配置OpenCV(C++)

    目录 第一章 Opencv安装及其环境变量配置 1 1下载并安装OpenCV 1 2 OpenCV环境变量配置 第二章 Visual Studio 2019 编译器下载安装 第三章 OpenCV开发环境配置 C 3 1创建项目 3 2 添加

随机推荐

  • 全国信息技术标准化技术委员会汉字内码扩展规范(GBK)

    全国信息技术标准化技术委员会 汉字内码扩展规范 GBK Chinese Internal Code Specification 1 0 版 按编码顺序排列 81 丂 丄 丅 丆 丏 丒 丗 丟 丠 両 丣 並 丩 丮 丯 丱 丳 丵 丷 丼
  • 记一次使用EasyExcel出现Convert excel format exception.You can try specifying the ‘excelType‘ yourself

    EasyExcel 3 0 出现 com alibaba excel exception ExcelCommonException Convert excel format exception You can try specifying
  • Vue常用知识点汇总

    1 Vue常见的指令有哪些 有什么用 1 v text 会替换掉元素里的内容 2 v html 可以渲染html界面 3 v clock 防止界面闪烁 4 v bind 界面元素属性值的绑定 简写为 5 v on 事件绑定 简写为 6 v
  • K8s 管理工具 kubectl 详解

    文章目录 一 陈述式管理 1 陈述式资源管理方法 2 k8s 相关信息查看 2 1 查看版本信息 2 2 查看资源对象简写 2 3 查看集群信息 2 4 配置kubectl自动补全 2 5 查看日志 2 6 基本信息查看 2 6 1 查看m
  • SPRING是如何解决循环依赖的?为什么无法解决多例和构造器的循环依赖

    标签 java spring 文章目录 1 什么是循环依赖 2 解决循环依赖思路 3 二级缓存能否解决循环依赖 三级缓存存在的意义 4 多例和构造器为什么无法解决循环依赖 5 如何进行扩展 6 spring在创建bean的时候 在哪里创建的
  • 【C++数据结构】程序性能分析

    程序性能分析 2 1 什么是程序性能 程序性能 所谓程序性能 performance of a program 是指运行这个程序所需要的内存和时间的多少 性能分析 在性能分析 performance analysis 时 采用分析方法 性能
  • 在gitee网页中创建分支后,在vscode中更新分支

    在vscode中更新gitee上创建的分支 在网页创建分支之后 vscode中git pull origin更新在gitee创建的分支 更新之后这里有origin test分支 选中之后 通过git bracn就可以看到线上的分支了
  • 深度理解yolov3损失函数

    深度理解yolov3损失函数 在yolov3中 loss分为三个部分 一个是xywh部分带来的误差 也就是bbox带来的loss 一个是置信度带来的误差 也就是obj带来的loss 最后一个是类别带来的误差 也就是class带来的loss
  • 支付订单同步回调

    public function pay params input 接收数据 判断订单号支付方式不为空 validate this gt validate params order sn gt require pay code 支付方式 gt
  • 30秒内便能学会的30个超实用Python代码片段

    许多人在数据科学 机器学习 web开发 脚本编写和自动化等领域中都会使用Python 它是一种十分流行的语言 Python流行的部分原因在于简单易学 本文将简要介绍30个简短的 且能在30秒内掌握的代码片段 1 唯一性 以下方法可以检查给定
  • MFC多线程同步

    MFC提供了多种同步对象 下面我们只介绍最常用的四种 1 临界区 CCriticalSection 2 事件 CEvent 3 互斥量 CMutex 4 信号量 CSemaphore 一 临界区 使用CCriticalSection类 是一
  • vue路由拦截

    1 在main js中写入下面这些代码 路由拦截 router beforeEach to from next gt if to meta requireAuth 判断该路由是否需要登录权限 if sessionStorage getIte
  • git 下载和安装

    1 什么是git git 是一个分布式的版本控制工具 git 官网 git 官网 2 为什么使用git 保留之前所有版本 以便后续的修改和回滚 方便多人协同开发 3 安装git 3 1 在Linux 上安装 以 Fedora 为例 如果你在
  • Nginx Ubuntu下编译和安装

    1 登录nginx官网http nginx org en download html 下载nginx最新版本 解压nginx 得到目录nginx 1 17 8 tar zxvf nginx 1 17 8 tar gz 2 下载http fl
  • YouCompleteMe unavailable : requires Vim 7.4.143

    版本问题 ubuntu 14 05 安装完YouCompleteMe后不生效 提示 YouCompleteMe unavailable requires Vim 7 4 143经过检索与查询 ubuntu自带的vim为7 4 50 需要安装
  • js延时函数

    js延时函数总结 在js中 延迟执行函数有两种 setTimeout和setInterval 用法如下 setTimeout test 5000 5秒后执行testFunction 函数 只执行一次 setInterval test 500
  • Ubuntu小技巧9--使用Samba服务实现Windows和Linux文件访问

    Ubuntu小技巧8 Ubuntu小技巧9 使用Samba服务实现Windows和Linux文件访问 很多时候做开发的时候需要在Linux上编译运行 但是又想用Windows的优秀工具 不停的将文件拷贝到Windows和Linux是极其浪费
  • 高德地图api之编码(Geocoder)

    高德地图目前仅支持中国范围内的的地理编码和反地理编码 当我们在做搜索功能的时候 由于用户不可以记住地点的经纬度 所以只可能输入地名 所以地理编码就显得额外重要 这里我们查看一下AMap api中的地理编码 地理编码 地理编码 顾名思义就是根
  • Linux系列:编写 jar包 启动脚本

    包含指定环境 启动的脚本 指定springBoot的 application properties 创建 start sh 文件 文件内容如下 1 直接启动 bin sh 该脚本为Linux下启动java程序的 1第一个参数为方法名star
  • 设计模式-装饰模式(Decorator)

    装饰模式又叫包装模式 通过一种对客户端透明的方式来扩展对象的功能 是继承关系的一个替换方案 角色和职责 1 抽象组件 Component Car 为统一接口 也是装饰类和被装饰类的统一接口 2 具体组件 concrete Component