设计模式学习之装饰器模式

2023-11-19

装饰器(Decorator)模式跟适配器(Adapter)模式一样,属于构建型设计模式。在学习适配器模式的时候说过,适配器模式的重点在复用能力,装饰器模式的重点在扩展能力。换言之,装饰器模式是先复用后扩展,这也导致了很多人跟适配器模式混淆。装饰器模式意在实现了相同接口的类,在不继承的情况下,实现组件的功能扩展。多内聚,少继承。例子是从网上摘录下来的:

[java]  view plain copy
  1. interface Sourcable {    
  2.     public void operation();  
  3. }   
[java]  view plain copy
  1. class Source implements Sourcable {    
  2.     public void operation() {    
  3.         System.out.println("原始类的方法");    
  4.     }    
[java]  view plain copy
  1. class Decorator1 implements Sourcable {    
  2.     private Sourcable sourcable;    
  3.     public Decorator1(Sourcable sourcable){    
  4.         super();    
  5.         this.sourcable=sourcable;    
  6.     }    
  7.     public void operation() {    
  8.         System.out.println("第一个装饰器前");    
  9.         sourcable.operation();    
  10.         System.out.println("第一个装饰器后");    
  11.     }  
  12. }  
[java]  view plain copy
  1. class Decorator2 implements Sourcable {    
  2.     private Sourcable sourcable;    
  3.     public Decorator2(Sourcable sourcable){    
  4.         super();    
  5.         this.sourcable=sourcable;    
  6.     }    
  7.     public void operation() {    
  8.         System.out.println("第二个装饰器前");    
  9.         sourcable.operation();    
  10.         System.out.println("第二个装饰器后");    
  11.     }    
  12. }  
[java]  view plain copy
  1. class Decorator3 implements Sourcable {    
  2.     private Sourcable sourcable;    
  3.     public Decorator3(Sourcable sourcable){    
  4.         super();    
  5.         this.sourcable=sourcable;    
  6.     }    
  7.     public void operation() {    
  8.         System.out.println("第三个装饰器前");    
  9.         sourcable.operation();    
  10.         System.out.println("第三个装饰器后");    
  11.     }    
  12. }   
[java]  view plain copy
  1. public class Test {  
  2.     /** 
  3.      * @param args 
  4.      */  
  5.     public static void main(String[] args) {  
  6.         Sourcable source = new Source();  
  7.         // 装饰类对象   
  8.         Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));  
  9.         obj.operation();  
  10.     }  
  11. }  

运行该程序的输出如下:

    第一个装饰器前
    第二个装饰器前
    第三个装饰器前
    原始类的方法
    第三个装饰器后
    第二个装饰器后
    第一个装饰器后


一层层装饰,相互之间解耦,如果new的时候换一种顺序,结果又是一种情况,这就是装饰器的巧妙之处。看懂了这个,那么java中的io包的装饰器模式就能了然。装饰器模式是除了继承之外,另一种扩展功能的办法。

参考资料:http://blog.csdn.net/vincentzhao2009/article/details/6201928

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

设计模式学习之装饰器模式 的相关文章

随机推荐

  • Android APK反编译教程

    目录 一 反编译工具 二 注意事项 三 apktool 1 1 官方链接 1 2 下载安装 1 3 使用 四 dex2jar 1 1 官方链接 1 2 下载安装 1 3 使用 五 jd gui 1 1 官方链接 1 2 下载安装 1 3 使
  • 百度广告联盟代码优化

    再分享一下我老师大神的人工智能教程吧 零基础 通俗易懂 风趣幽默 还带黄段子 希望你也加入到我们人工智能的队伍中来 https blog csdn net jiangjunshow
  • 关于Delphi的时间格式,图片处理的一些常用操作

    1 delphi 将字符串转换为时间 可以通过TFormatSettings 类来设置 FSetting ShortDateFormat yyyy MM dd FSetting DateSeparator DateTime1 StrToDa
  • vue若依前端项目搭建

    1 项目搭建 首先进入到你需要创建的项目目录下面 然后输入命令vue create 创建项目 接下来选择手动搭建 然后把下面图片中的内容选上 再然后继续配置一些参数信息 接下来运行npm run serve项目就启动起来了 2 配置登录界面
  • 【学习】若依源码(前后端分离版)之 “ 上传图片功能实现”

    大型纪录片 学习若依源码 前后端分离版 之 上传图片功能实现 前言 前端部分 后端部分 结语 前言 图片上传也基本是一个项目的必备功能了 所以今天和大家分享一下我最近在使用若依前后端分离版本时 如何实现图片上传功能的经验和心得 前端部分 在
  • 服务器硬件知识普及篇(需要配置服务器的朋友可以参考)

    开篇一 服务器主板 服务器主板概述 对于服务器而言 稳定性才是首要 服务器必须承担长年累月高负荷的工作要求 而且不能像台式机一样随意的重起 为了提高起可靠性普遍的做法都是部件的冗余技术 而这一切的支持都落在主板的肩上 下面我就来看看有关服务
  • JAVA word转pdf各个版本都支持,aspose-words

    以下提供两种方法实现 建议使用aspose 一 第一种 使用aspose words Word转PDF 第一步 首先需要下载aspose words 15 8 0包 官方的地址很慢 并且包下载不下来 有需要可以去GITHUB上寻找 这里我提
  • async/await处理多个异步请求

    async await 处理异步操作 axios defaults baseURL http localhost 9999 async function queryData let result await axios get adata
  • 使用MyEclipse创建JSP页面的一般步骤

    一 MyEclipse下建立点 当然事先JDK以及Tomcat以及装好 在包资源管理器中 新建Web Project 站点名称 MyJSP2 选择当前站点的工作目录 默认是我们打开MyEclipse时设置的工作目录 在这里也可以修改 最好是
  • 关于写死bootargs实例

    文章目录 1 说明 2 举例 3 原理 1 说明 1 附加的内核命令行 cmdline BOARD KERNEL CMDLINE 在build core Makefile中 有以下一段内容 strip起到去除空格的作用 BOARD KERN
  • 2020-03-12 git分支

    1 git c 配置 git c
  • mysql怎么生成ER_navicat怎么生成er

    Navicat软件真是一个好东西 今天需要分析一个数据库 然后想看看各个表之间的关系 所以需要查看表与表之间的关系图 专业术语叫做ER关系图 默认情况下 Navicat显示的界面是这样的 软件将表当做一个对象 然后显示了所有的表 仅仅通过这
  • 进程同步之信号量机制(pv操作)及三个经典同步问题

    1 信号量机制 信号量机制即利用pv操作来对信号量进行处理 什么是信号量 信号量 semaphore 的数据结构为一个值和一个指针 指针指向等待该信号量的下一个进程 信号量的值与相应资源的使用情况有关 当它的值大于0时 表示当前可用资源的数
  • 将控制台内容重定向至文件

    使用os system command 等模块执行系统命令时 返回值为命令执行结果 命令执行成功返回Ture 否则返回False 若要得命令本身返回的内容 需要将命令输出至控制台的内容写到文件中 即将标准输出由控制台重定向至文件 将控制台内
  • element时间选择器的默认值

    概览 vue使用element组件 需要给时间选择器设置默认值 场景一 默认时间选择器 场景二 时间范围选择器 开始时间和结束时间 一 默认时间选择器 实现思路 element组件的v model绑定的数据变化 则时间选择器的默认值变化 可
  • element-ui对话框dialog详解

    效果展示 先给大家展示一下大致的样式 代码
  • 删除卡在C盘和D盘之间的恢复盘

    依次点击 此电脑 gt 管理 gt 磁盘管理 可以看到上图中C盘和D盘之间有一个恢复分区 导致即使删除D盘 C盘也无法进行拓展 并且中间的分区是没法右键删除的 搜索 cmd 右键以管理员方式运行 输入命令删除恢复盘 Microsoft Wi
  • element-tree树结构-默认选中第一个节点高亮-根据id选中节点高亮

    前言 tree树结构是在开发中经常使用的组件 比如区域树 楼层树 组织架构树 等等包含节点关系 实际开发可能需要我们一进到页面选中树形结构第一个节点 并且调用数据 来达到用户体验 在用户选择之后 通过本地存储的方式把楼层id存起来 刷新之后
  • 使用Docker registry镜像创建私有仓库

    2015 01 25 wcdj 摘要 安装Docker后 可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境 本文记录简单的搭建过程 1 使用registry启动私有仓库的容器 docker run d p 5000 50
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆