| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 一文弄懂23种设计模式之装饰器模式 -> 正文阅读 |
|
[Java知识库]一文弄懂23种设计模式之装饰器模式 |
前言装饰器模式Reference[2]?c.biancheng.net/view/1397.h… [3]?refactoringguru.cn/design-patt… 什么是装饰器模式
场景假设你正在开发一个提供通知功能的库, 其他程序可使用它向用户发送关于重要事件的通知。 最初的版本基于 Notifier 类,用来接受客户端消息参数并发送给一系列邮箱,邮箱列表通过构造函数传递。 后续有新的需求增加, 用户要求能够在手机短信、微信、QQ上接收消息,那么可以这样做,扩展通知类,在子类中加入额外的通知方法,然后组合多种通知方法即可解决问题 弊端
解决方案
因此我们可以换个角度,将 send 方法这个通知行为放在基类通知器中,将所有其他方法放入装饰中。 这样,客户端代码就可以以装饰器的模式封装自己想要的功能 装饰模式结构结构1
如果只有一个具体构件而没有抽象构件时,可以让抽象装饰继承具体构件,也就是上面的 Notifier 的例子 结构2
如果只有一个具体装饰时,可以将抽象装饰和具体装饰合并 结构3这个是经典的装饰器结构
核心设计装饰模式的核心在于抽象装饰类的设计,其典型代码如下所示:
在抽象装饰类Decorator中定义了一个Component类型的对象component,维持一个对抽象构件对象的引用,并可以通过构造方法或Setter方法将一个Component类型的对象注入进来,同时由于Decorator类实现了抽象构件Component接口,因此需要实现在其中声明的业务方法operation(),需要注意的是在Decorator中并未真正实现operation()方法,而只是调用原有component对象的operation()方法,它没有真正实施装饰,而是提供一个统一的接口,将具体装饰过程交给子类完成。 在Decorator的子类即具体装饰类中将继承operation()方法并根据需要进行扩展,典型的具体装饰类代码如下:
在具体装饰类中可以调用到抽象装饰类的operation()方法,同时可以定义新的业务方法,如 addedBehavior() 由于在抽象装饰类Decorator中注入的是Component类型的对象,因此我们可以将一个具体构件对象注入其中,再通过具体装饰类来进行装饰;此外,我们还可以将一个已经装饰过的Decorator子类的对象再注入其中进行多次装饰,从而对原有功能的多次扩展。 案例设计Sunny软件公司基于面向对象技术开发了一套图形界面构件库VisualComponent,该构件库提供了大量基本构件,如窗体、文本框、列表框等,由于在使用该构件库时,用户经常要求定制一些特效显示效果,如带滚动条的窗体、带黑色边框的文本框、既带滚动条又带黑色边框的列表框等等,因此经常需要对该构件库进行扩展以增强其功能 直接利用装饰器模式,进行系统设计,使系统具有更好的灵活性和扩展性 具体代码
客户端代码
装饰器模式在?Java?语言中的最著名的应用莫过于 Java I/O 标准库的设计了。例如,InputStream 的子类 FilterInputStream,OutputStream 的子类 FilterOutputStream,Reader 的子类 BufferedReader 以及 FilterReader,还有 Writer 的子类 BufferedWriter、FilterWriter 以及 PrintWriter 等,它们都是抽象装饰类。
小结装饰器模式的主要优点有:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:59:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |