结构型模式——装饰者设计模式
发布日期:2021-07-27 04:57:00
浏览次数:4
分类:技术文章
本文共 1800 字,大约阅读时间需要 6 分钟。
装饰模式指的是在不必改变原类文件和继承的情况下,动态地扩展一个对象的功能。
它是通过创建一个包装对象,也就是装饰来包裹真实的对象,比如处理流。
应用场景:需要扩展一个类的功能,或给一个类添加附加职责。
优点就是耦合性低,重用性高(高内聚,低耦合)。
案例分析
- 抽象类ReadFile,用来读取文件,里面有一个抽象方法read
- 该抽象类有三个子类,分别为读取文本文件类、读取音乐文件类和读取视频文件类
- 现在提出了新的要求和功能:这三个子类必须各自增加缓冲机制功能,以提高读写效率
按照一般的方法,要么就是分别修改各自的read方法,要么就是再写3个子类去继承重写read,但继承本身就是高耦合的方式,会将父类有用没用的方法都继承过来,从而使程序臃肿。
这里最好的处理办法就是在类内创建父类对象,然后调用其某一个方法,保证高内聚,同时低耦合,也就是装饰者模式。
//ReadFile抽象类public abstract class FileRead { abstract void read();}//读取文本文件类public class FileTextRead extends FileRead { String name = "文本"; @Override void read() { System.out.println(name + "文件直接读取....."); }}//读取音乐文件类public class FileMusicRead extends FileRead { String name = "音乐"; @Override void read() { System.out.println(name + "文件直接读取......."); }}//读取视频文件类public class FileVedioRead extends FileRead { String name = "视频"; @Override void read() { System.out.println(name + "文件直接读取,......"); }}/*** 缓冲类,同样继承ReadFile类,但是里面创建了父类对象,可以传入其三个子类对象* 实现了三个子类各自功能的同时还增加了缓冲机制*/public class BufferdFileRead extends FileRead { private FileRead fileRead; //这里会实现多态 public BufferdFileRead(FileRead fileRead) { this.fileRead = fileRead; } @Override void read() { //这个read方法是缓冲类自己的read fileRead.read(); //这个read是传入的FileRead类对象或者其子类对象的read方法 System.out.println("缓存。。。。。"); }}//测试类public class test { public static void main(String[] args) { FileTextRead fileTextRead = new FileTextRead(); FileMusicRead fileMusicRead = new FileMusicRead(); FileVedioRead fileVedioRead = new FileVedioRead(); new BufferdFileRead(fileTextRead).read(); new BufferdFileRead(fileMusicRead).read(); new BufferdFileRead(fileVedioRead).read(); }}
这种模式,重点在于其设计结构。
转载地址:https://blog.csdn.net/qq_45337431/article/details/99203909 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年09月26日 21时42分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java设计基本原则----单一职责原则
2019-05-27
HashMap的实现
2019-05-27
互斥锁 synchronized分析
2019-05-27
java等待-通知机制 synchronized和waity()的使用实践
2019-05-27
win10 Docke安装mysql8.0
2019-05-27
docker 启动已经停止的容器
2019-05-27
order by 排序原理及性能优化
2019-05-27
Lock重入锁
2019-05-27
docker安装 rabbitMq
2019-05-27
git 常用命令 入门
2019-05-27
linux安装docker
2019-05-27
关闭selinx nginx无法使用代理
2019-05-27
shell 脚本部署项目
2019-05-27
spring cloud zuul网关上传大文件
2019-05-27
springboot+mybatis日志显示SQL
2019-05-27
工作流中文乱码问题解决
2019-05-27
maven打包本地依赖包
2019-05-27
spring boot jpa 实现拦截器
2019-05-27
jenkins + maven+ gitlab 自动化部署
2019-05-27
Pull Request流程
2019-05-27