设计模式之装饰者模式-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 的设计模式之一装饰者模式
刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...
随机推荐
- redis集群报错:(error) CLUSTERDOWN Hash slot not served
百度上坑太多,如果你遇到搭建redis集群的时候出现这个错误在百度上找到解决办法基本上都是坑. 首先集群搭建完成后,你肯定去登陆redis进行测试 1.redis01/redis-cli -h &qu ...
- nfs与dhcp服务
NFS服务端概述 NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS: NFS允许一个系统在网络上与他人共享目录 ...
- Selenium自动化Chrome浏览器 在windows下窗口最大化
本人由于是搞自动化时间不长,所以踩了很多坑.准备把踩得这些坑记录下来. 自动化测试最基础的就是打开浏览器然后让Windows窗口最大化. 一开始百度了好多窗口最大化的方法,最常用的是: WebDriv ...
- Linux下安装docker(1)
1.由于centos系统已经自带docker源了,所以可以直接安装: yum install docker 如果是centos6.5版本的,使用yum -y install docker-io 进行安 ...
- 学习笔记 urllib
第一步: get # -*- coding:utf-8 -*- # 日期:2018/5/15 19:39 # Author:小鼠标 from urllib import request url = ' ...
- eclipse使用报错集锦
问题1.Eclipse启动时总是提示“subversive connector discovery”解决方案 解答1:在eclipse_workSpace(工作空间下)\.metadata\.plug ...
- rsync:基本命令和用法
以下是rsync系列篇: 1.rsync(一):基本命令和用法 2.rsync(二):inotify+rsync详细说明和sersync 3.rsync算法原理和工作流程分析 4.rsync技术报告( ...
- IntelliJ IDEA 破解Jrebel6.3.0安装
首先下载所必要的两个文件(jrebel3.6.0和cracked文件) 密码:pvsd 注意:如果不是该版本的Jrebel该破解文件可能无效. 步骤1:安装 解压文件得出两个压缩包 在idea中选择 ...
- dubbo rest服务 No provider available for the service 错误问题
1.版本 dubbo 2.6.2 2.描述 消费者调用dubbo rest服务报No provider available for the service错误 网络上有讲是实体类未实现Serializ ...
- Awvs、Snort的下载安装
学渗透测试是我对自己的奖赏. 这是Awvs环境的搭建. 推荐链接:https://www.cnblogs.com/show2008/p/10371461.html 这是Snort环境搭建. 推荐链接: ...