修饰器设计模式

--最近我给女朋友买了一款可以更换外壳的手机。现在的外壳是红色的,假如我想用这款手机的时候,会更换成银灰色的外壳。但是我不能随意更换天线或者话筒,因为这些功能模块在手机生产的时候就已经被固定了。


在维基百科中的介绍是如此:

修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。

我们来解释一下这段话,有几个关键词“动态”和“对象”。

首先解释一下动态,Java多态的实现方式:重载和重写。

重载是就是动态绑定,或者说是运行时绑定,具体体现在只有运行的时候根据传的参数来决定运行的方法,而重写是编译时绑定,具体表现为一旦在子类中覆盖了父类的方法,编译后引用此方法时都只会指向子类的实现了。

而在修饰模式中也是通过一定编程的技巧来达到这个动态绑定的效果。

简单来说,修饰模式的设计核心是用一个修饰器类作为容器来包裹原来的类,一般将原来的类对象作为构造器参数传入。

这里想必大家也注意到了,是把类的对象作为参数传入,而不是类。这也是上面的关键词“对象”,修饰器修饰的是对象,而并非类。

至于为什么会引入修饰模式呢?稍微讨论一下,如果不使用修饰器模式的话:

那么假设A类是基类,你需要基于A类的基础上扩展十几种功能,而且这些功能的实现都要是不同的一个子类。你将可能出现需要实现一个功能就要实现一个新的子类,甚至当你需要有多重功能组合的时候,这些子类又将成倍增长,不仅仅是耦合度高,而且类的数量也会产生一种“类爆炸”的效应。

如果用修饰器的话,就相当于一把开枪声音很大的枪支,可以往上面套上消音器,这样它就扩展了消音的功能,而且摘下来之后又和原来的枪一样了。或者在工业上我们随处可以见到这样的东西,耳机、话筒(外置)。

其实对于写框架或者对Java特别熟悉的人,应该都知道Java IO也是遵循了修饰器的设计模式。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;import org.junit.Test;public class FileReader {@Testpublic void test() {java.io.FileReader fr;BufferedReader br = null;try {String path = this.getClass().getResource("1.txt").getFile();File f = new File(path);fr = new java.io.FileReader(f);br = new BufferedReader(fr);String str = br.readLine();System.out.println(str);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (br != null)try {br.close();} catch (IOException e) {e.printStackTrace();}}}
}

可以看到上面这段代码 BufferedReader(修饰器容器)包裹了FileReader(原类)对象,扩展了缓存功能。

在Spring中有一个与BeanFactory接口一样使用很频繁的单词 FactoryBean,就是用到了修饰器模式和工厂模式来实现的。

也就是相对于BeanFactory这个IOC容器而言,FactoryBean是一个能产生或者修改对象产生bean的一个特殊bean。也就是根据不同的原料生成不同的产品。

关于FactoryBean等更理解之后再做讨论。

转载于:https://www.cnblogs.com/gabin/p/4024056.html

修饰器模式(day04)相关推荐

  1. python模式选择符,Python设计模式之修饰器模式

    无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如:添加一个新方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继承 ...

  2. python 修饰器 教程_python 实现 修饰器模式

    无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 与继承相比,通常应该优先选择组合,因为继 ...

  3. python修饰器_python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

  4. 结构型模式---修饰器模式

    修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法.1.如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法)2.使用组合3.使用继承 与继承相比,通常应该优 ...

  5. 第六天:结构型模式--修饰器模式

    ####零.修饰器模式 当我们相对一个对象添加新功能的时候,无非就是下面这三种方法: 直接修改对象所属类 使用组合 使用继承 这里我们会优先考虑使用直接修改对象类,如果行不通我们会使用组合,最次的情况 ...

  6. Go 语言实现 23 种设计模式(修饰器)

    修饰器 修饰器模式就是在不改变对象内部结构的情况下,动态扩展它的功能. Example_one type Object func(string) stringfunc Decorate(fn Obje ...

  7. python 装饰器 继承_Python设计模式之装饰器模式

    装饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) 使用组合 使用继承 注意,本文中的Decorat ...

  8. python3 修饰器_Python3基础之: Decorator (修饰器)

    0.引子 如果你正在做一个网站,且需要为每次请求做登录状态的检测.在收到用户每一个访问请求的第一步,你都要检测一下用户的登录状态.然而为每个访问请求做额外状态检测,真的是一件不那么优雅,繁琐而又不那么 ...

  9. es6 使用修饰器实现Mixin模式

    使用修饰器实现Mixin模式 在修饰器的基础上,可以实现Mixin模式.所谓Mixin模式,就是对象继承的一种替代方案,中文译为"混入"(mix in),意为在一个对象之中混入另外 ...

最新文章

  1. mysql修改主键属性_mysql如何改变主键属性
  2. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
  3. Partition List
  4. Linux netstat命令介绍
  5. 条件运算符?:接受三个操作数,是C#中唯一的三元运算符(转)
  6. 【OpenCV3】cv::Mat中的数据按行列写入txt文件中
  7. 二分类最优阈值确定_分类模型评价标准,AUC还是Macro F1?
  8. GOF之创建型模式(重点)
  9. IE8中伪元素动态作用样式不重绘bug记录
  10. java中的 BigDecimal 和 String 的相互转换
  11. MFC Bitmap::FromBITMAPINFO返回空问题
  12. 二 Djano模型层之模型字段选项
  13. LU分解算法(串行、并行)
  14. collect2: error: ld returned 1 exit status(解决方案大总结)
  15. Compose Modifier
  16. 什么是电影级调色监视器?
  17. Android jetpack Room数据库(一)基本使用
  18. centOS 7 安装可视化用户界面
  19. 愿你三冬暖,愿你春不寒
  20. C语言rot90的头文件,python – np.rot90()破坏了opencv图像

热门文章

  1. Makefile 中 -wl ,rpath 以及 O0 O1 O2 O3 Os 的用法
  2. 关于VR全景创业分析
  3. 解决用Xshell工具通过ssh登陆linux操作系统提示找不到匹配的host key算法问题
  4. nginx lua 调试 - 死磕
  5. putty使用教程(总结)
  6. C++中的assert用法
  7. 毕业生入户深圳2023办理全流程
  8. php网页第一张图片不显示不出来了_网页图片不能显示|网页不显示图片|网页图片显示不出来 - 网页图片无法显示的解决方法 - 安全专题...
  9. Mifare卡的基本原理是什么?
  10. Python爬虫简单入门教程