设计模式之装饰者模式-java实例
设计模式之装饰者模式
需求场景
- 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式。
- 我们已经有了产品,而且这个产品的功能非常复杂,我们想要给这个产品加上新的功能,但是我们不愿意去修改其他功能的源代码,此时也可以使用装饰者模式对产品的功能进行扩展。
- 上面的场景是基于生产环境的场景,在我们普通的编码过程中,遇到类似的问题,也可以考虑使用装饰者模式对方法进行增强。
前提条件
想要使用装饰者模式,我们需要获取到被装饰的类所实现的接口,这样才能对这个类进行修饰或补强。
案例
首先是我们的产品接口,比如现在我们的产品是一部手机,我们的接口标准是IMobile,它有一个通话的功能call。
public interface IMobile {
public void call();
}
现在我们的产品为了适应市场通用标准,我们也实现了这个标准接口,开发出了我们的手机产品的操作软件。
public class MobileImpl implements IMobile {
@Override
public void call(){
System.out.println("双方通话中");
}
}
我们的软件卖给了客户,而客户是不知道我们的源代码的,只得到了我们提供的jar包。但是现在用户那边由于业务需求,在通话之前需要获取到当前通话双方的位置信息,这个功能是我们没有提供的。现在客户打算自己来增强这款软件的功能,就需要用到装饰者模式。客户自己也实现当前的市场标准接口,将我们产品的实现类传递进去进行装饰。
public class CustomMobileImpl implements IMobile {
//被装饰的产品
private IMobile mobile;
//构造方法传入被装饰产品
public CustomMobileImpl(IMobile mobile){
this.mobile = mobile;
}
//产品功能补强
@Override
public void call(){
//补强的功能
System.out.println("获取通话双方位置信息")
//原来的功能
mobile.call();
}
}
现在,我们在没有修改源代码,也不知道源代码的情况下,得到了一款功能增强的产品,让我们来试一试吧。
public class Test{
public static void main(String[] args){
IMobile mobile = new CustomMobileImpl(new MobileImpl());
mobile.call();
}
}
结果如下:
获取通话双方位置信息
双方通话中
总结
装饰者模式是一种常用的开发模式,可以帮助开发者在不修改原来的功能代码的情况下,对原来的方法进行增强,前提是装饰类要和被装饰类实现同样的接口。
开发模式是前人对某一类相似问题的解决方案进行的总结,我们可以从中吸取经验,但也不能盲目使用,也不能为了使用设计模式而使用设计模式。作为一个coder,要始终保持自己活跃的思维,不能将思维局限在一个设计模式上。开发熟练度在一定程度上决定了你的工作效率,但是思维的活跃度和发散性决定了你的天花板,也在很大程度上决定了你的工作效率。
你虽然在为别人工作,但是,你也在创造自己的世界!
设计模式之装饰者模式-java实例的更多相关文章
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
- Java设计模式之装饰者模式
要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...
- C#设计模式(9)——装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
- 实践GoF的23种设计模式:装饰者模式
摘要:装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力.理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性. 本文分享自华为云社区<[Go实现]实践GoF的2 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- PHP设计模式之装饰器模式(Decorator)
PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- Java 的设计模式之一装饰者模式
刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...
随机推荐
- axios与vue的配合使用事例,实现缓存和重复加载的控制
import Vue from "vue"; import qs from "qs"; import Store from "../vuex/stor ...
- 关于RandomAccessFile一个坑!!!!
最近正好遇到了使用RandomAccessFile做断点下载的情况,被一个问题坑了好多次 本来的代码: RandomAccessFile randomAccessFile = new RandomAc ...
- python3 lcs 最大公共子序列
抛出问题: 假定字符串 s1 = 'BDCABA', s2 = 'ABCBDAB',求s1和s2的最大公共子序列. 问题分析: 我们想要求出s1和s2的最大公共子序列,我们可以用c(i,j)表示s1( ...
- 74.纯 CSS 创作一台 MacBook Pro
原文地址:https://segmentfault.com/a/1190000015568609 HTML code: <div class="macbook"> &l ...
- 在下载SOPC代码的过程中遇到的一些错误
(1)Error (209015): Can't configure device. Expected JTAG ID code 0x02D120DD for device 2, but found ...
- DOM编程艺术章12:一个简单的Ajax例子
大概入了JavaScript的门,现在要回过头恶补Ajax和json了,随手翻到dom编程艺术发现有一个适合回忆的例子,先抄录下来,引入对Ajax作用的大概印象,再去掰开了研究. <!DOCTY ...
- Log4j日志框架学习零到壹(一)
日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...
- mysql监控执行的sql语句
转载 https://blog.csdn.net/nzjdsds/article/details/77513869 MySQL用SQL开启general_log并设置路径 2017年08月24日 00 ...
- centos7 根分区扩容
系统安装时候使用的默认分区,根分区只分了50G,使用的是LVM 想把home分区分出来660G给根分区 先查了点资料开搞 由于xfs分区只支持增大,不支持缩小,所以home目前是xfs格式无法进行缩小 ...
- C#进阶系列——WebApi 跨域问题解决方案:CORS(转载)
C#进阶系列——WebApi 跨域问题解决方案:CORS 阅读目录 一.跨域问题的由来 二.跨域问题解决原理 三.跨域问题解决细节 1.场景描述 2.场景测试 四.总结 正文 前言:上篇总结了下W ...