设计模式的应用场景(9)--装饰模式

2023-11-09

装饰模式

定义:装饰模式以对客户端透明的方式扩展对象的功能,是继承方案的一个替代方案,提供比继承更多的灵活性。

优点:能够提供比使用继承关系更加灵活的拓展对象的功能,它可以动态增加对象的功能并且可以随意组合这些功能。

缺点:使用装饰模式进行设计往往会产生很多看上去相似的小对象。

使用时机:当系统需要扩展一个类的功能,或者客户端需要动态的给一个对象添加功能,并且使用继承会很复杂时候。

其实对于装饰者模式大家并不陌生,相反接触的还很平凡,因为Java中的IO机制就用到了装饰者模式。比如大家最常用的语句:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filepath)));

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

就是最常见的装饰者模式了,通过BufferedReader对已有对象FileReader的功能进行加强和优化。其实它不仅可以加强FileReader,所有的字符输入流都可以通过这种方式进行包装。它是如何实现的呢?注意重点来了:其实很简单,它只不过将所有的字符输入流抽象出了一个基类或接口 即Reader,然后通过构造方法的形式将Reader传递给BufferedReader,此时BufferedReader就可以对所有的字符输入流进行拦截和优化了。

  试想一下,如果采用继承机制,每个XXXReader就要衍生出一个BufferedXXXReader,再加上字符输出流和字节输入输出流,那么Java的IO体系结构该是多么的臃肿不堪啊!而装饰者模式的出现解决了这个问题,并且,装饰者的出现也再一次的证明了面向对象的设计原则:多用组合,少用继承!对扩展开放,对修改关闭!

下面再给出一个例子, 
小巩需要为公司设计手机相关的业务,

public interface Phone {
    void call(String name);
}
public class PhoneImpl implements Phone {
    public void call(String name) {
        System.out.println(name + " 正在通话中");
    }
}

彩铃手机

public class ColorPhoneDecorator extends PhoneDecorator {
    public ColorPhoneDecorator(Phone phone) {
        super(phone);
    }

    public void call(String name) {
        System.out.println("播放彩铃");
        super.call(name);
    }
}

广告手机

public class AdPhoneDecorator extends PhoneDecorator {
    public AdPhoneDecorator(Phone phone) {
        super(phone);
    }

    public void call(String name) {
        super.call(name);
        System.out.println("播放广告");
    }
}

假如客户需要支持彩铃和广告的手机

public class Client {
    public static void main(String[] argv) {
        Phone phone = new PhoneImpl();
        //如果需要彩铃的手机
        PhoneDecorator phoneDecorator = new ColorPhoneDecorator(phone);
    //  phoneDecorator.call("张三");
         //如果需要广告的手机
        //phoneDecorator = new AdPhoneDecorator(phone);
        //phoneDecorator.call("张三");
        //如果需要既播放彩铃又播放广告的手机
        phoneDecorator = new AdPhoneDecorator(phoneDecorator);
        phoneDecorator.call("张三");
    }
}

 

 

 

 

https://blog.csdn.net/zhi_fu/article/details/77677251

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

设计模式的应用场景(9)--装饰模式 的相关文章

  • 诺基亚发布NetAct云网络管理系统,为5G网络演进铺路

    诺基亚近日发布了NetAct网络管理系统 NMS 的云版本 NetAct云将能够满足5G网络巨大的数据处理需求 并开始向跨硬件 hardware agnostic 部署场景发展 在运营商计划发展5G的进程中 除了提供全面自动化移动网络控制外
  • Linux安装negix

    本文章介绍了在CentOS7 9 64位系统下 安装neginx 1 20 2版本 注意红色字体都是我踩的坑 目录 第一步 下载negix和安装依赖 第二步 解压安装 第三步 执行配置命令 第四步 编译和安装 第五步 启动nginx 第六步

随机推荐

  • security与cas的集成(serviceProperties中的sendRenew的设置)

    在spring于security的集成中 serviceProperties的配置如下
  • File类的知识1

    File类 递归 java io File 类是文件和目录路径名的抽象表示 主要用于文件和目录的创建 查找和删除等操作 java io File类 文件和目录路径名的抽象表示形式 java把电脑中的文件和文件夹 目录 封装为了一个File类
  • python数据可视化毕业设计题目_基于Python的数据可视化

    基于 Python 的数据可视化 杨凯利 1 山美娟 2 期刊名称 现代信息科技 年 卷 期 2019 000 005 摘要 在大数据快速发展的今天 Python 丰富的工具包在科学计算 文件处 理 数据可视化等领域越来越凸显其价值 能够发
  • UWB信号对服务器有没有干扰,UWB组网定位的系统及方法技术方案

    技术实现步骤摘要 本专利技术涉及一种UWB组网定位的系统 更具体地 涉及一种UWB组网定位的系统及方法 技术介绍 UWB UltraWideband 是一种无载波通信技术 利用纳秒至微微秒级的非正弦波窄脉冲传输数据 通过在较宽的频谱上传送极
  • DEDECMS调用指定ID文章内容

    备忘自用 dede arclist idlist 113 114 115 116 channelid 1 addfields body li a href div class show h2 field shorttitle h2 p fi
  • 【华为OD】 最佳对手_贪心思维

    目录 一 题目描述 二 输入描述 三 输出描述 3 1 用例 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 游戏里面 队伍通过匹配实力相近的对手进行对战 但是如果匹配的队伍实力相差太大 对于双方游戏体验都不会太
  • 1330. 翻转子数组得到最大的数组值

    贪心法 1 翻转中间 则使用 最小区间最大值 最大区间最小值 2 基准为数组值 这里不一定为正收益 2 翻转头或者尾 则位基准重新计算翻转点 基准 sum abs num i num i 1 1 lt i
  • 一阶系统的时域和频域分析

    文章目录 1 一阶系统传递函数的标准形式 2 一阶系统动态性能指标 2 1 时域响应下的性能指标 2 2 系统单位阶跃响应 2 2 其他典型输入下一阶系统的响应和动态性能 3 惯性环节 4 一阶系统的频域分析 1 一阶系统传递函数的标准形式
  • yaml for java_java操作yaml文件

    前言 YAML YAML Ain t Markup Language 也可以叫做YML 是一种人性化的数据序列化的语言 类似于XML JSON SpringBoot的配置文件就支持yaml文件 官网 语法 大小写敏感 使用缩进表示层级关系
  • 快速上手笔记,PyTorch模型训练实用教程(附代码)

    前言 自 2017 年 1 月 PyTorch 推出以来 其热度持续上升 一度有赶超 TensorFlow 的趋势 PyTorch 能在短时间内被众多研究人员和工程师接受并推崇是因为其有着
  • JAVA程序员预备知识&初识JAVA

    JAVA程序员预备知识 什么是计算机 能够按照程序运行 自动 高速处理海量数据的现代化智能电子设备 由硬件和软件组成 广泛应用在 科学计算 数据处理 自动控制 人工智能等 计算机硬件 一些物理装置按系统结构的要求构成一个有机整体 组成 CP
  • Linux 快捷键

    Linux 快捷键 文章目录 linux控制台快捷键 linux控制台快捷键 ctrl a e Ctrl Shift n 新终端 Shift Ctrl T 打开新的标签页 Shift Ctrl W 关闭标签页 Alt 数字 切换至对应的标签
  • Hive--HiveQL:查询

    4 查询 4 1 select from语句 4 1 1 基本操作 select是SQL的射影算子 from子句标识了从哪个表 视图或嵌套查询中选择记录 回顾之前创建的employees表 hive mydb gt create table
  • 【Detectron2】入门05 Schedules Faster R-CNN

    Detectron2的Learning Rate和Schedules 1x and 3x schedules 1x 16 images iterations 90 000 iterations in total with the LR re
  • 14 - Spring5 学习笔记 - 整合日志框架、@Nullable 注解

    Spirng5 框架新功能 1 整个 Spring5 框架基于 Java8 运行时兼容 JDK9 许多不建议使用的类和方法在代码库中删除 2 Spring5 框架自带了通用的日志封装 1 Spring5 已经移除了 Log4jConfigL
  • c++ 不插入重复元素但也不排序_十大经典排序算法,看这篇文章就够了

    微信公众号 小超说 如果你觉得对你有帮助 欢迎分享 如果你想系统地学习 建议在电脑端阅读 我想大家学习算法之旅的开端就是各种排序算法吧 的确 排序算法广泛的应用性以及它的简洁基础等性质是初学者的不二之选 那今天我就带着你复习回顾以下各种经典
  • Docker镜像相关操作有哪些?

    什么是Docker Docker是一个开源的应用容器引擎 它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 然后发布到安装了任何 Linux 发行版本的机器上 Docker基于LXC来实现类似VM的功能 可以在更有限的硬件资源上提
  • 2020年第十一届蓝桥杯省赛javab组寻找2020

    简单的模拟 向右 向下 向右下 package 算法 import java util Scanner public class 寻找20 static int N 100000 4 5 static int M 1000 5 static
  • python实现车牌识别系统

    车牌识别系统 算法参考 http www zengqiang club blog 34 GUI参考 https blog csdn net wzh191920 article details 79589506 基于opencv的模板识别来实
  • 设计模式的应用场景(9)--装饰模式

    装饰模式 定义 装饰模式以对客户端透明的方式扩展对象的功能 是继承方案的一个替代方案 提供比继承更多的灵活性 优点 能够提供比使用继承关系更加灵活的拓展对象的功能 它可以动态增加对象的功能并且可以随意组合这些功能 缺点 使用装饰模式进行设计