从一碗小米粥谈装饰器模式,代理模式的区别
代理与装饰器
场景描述
代理即代替意思,可替代原类的所有功能,即和原类实现相同的规范。代理模式和装饰器模式很像。
每天清晨起来,紧张的洗漱之后,来到楼下的早餐店,我通常都会要一碗小米粥,这时候盛粥的大姐姐通常会问一句加不加糖,我回答不加,这时候我就会得到一碗热腾腾香喷喷的小米粥。
基础实现
一个小米粥的接口:
publicinterface MilletCongee {/*** 打印小米粥中含有的成分*/void printIngredient ();}
默认的不加糖的小米粥的实现:
public class GeneralMilletCongee implements MilletCongee{@Overridepublic void printIngredient() {System.out.println("小米粥");}}
点餐:
public class Order {public static void main(String[] args) {MilletCongee milletCongee=new GeneralMilletCongee();milletCongee.printIngredient();}}
一碗小米粥,不加糖:
装饰器模式
得到一碗热腾腾香喷喷的小米粥,尝了一口,感觉不是很好喝,接着又尝了一口,嗯感觉还是加点糖比较好,于是我又来到盛小米粥的大姐姐旁边,让她帮我加了点糖。
/*** 糖装饰器,用来给小米粥加糖*/
public class SugarDecorator implements MilletCongee {/*** 拥有的小米粥对象*/private final MilletCongee milletCongee;public SugarDecorator(MilletCongee milletCongee) {this.milletCongee = milletCongee;}@Overridepublic void printIngredient() {System.out.println("糖");this.milletCongee.printIngredient();}}
大姐姐把加好糖的小米粥重新递给了我,尝了一口,嗯真是香甜可口。
public class Order {public static void main(String[] args) {MilletCongee milletCongee=new GeneralMilletCongee();milletCongee=new SugarDecorator(milletCongee);milletCongee.printIngredient();}}
看了一下小米粥的成分,加上了糖。
注意这两行:
MilletCongeemilletCongee=new GeneralMilletCongee();//点了一碗小米粥
milletCongee=newSugarDecorator(milletCongee);//给小米粥加了点糖
装饰器模式适合什么场景呢?假设我有一个对象,但是这个对象的功能不能令我满意,我想给他加上一些功能,如何才能实现呢,那我就拿装饰器给他装饰一下就ok了。
代理模式
第二天早上,吃早餐的时候我又点了一碗小米粥,这时候盛粥的大姐姐抛出了昨天同样的问题给我,加不加糖?想起昨天的情景和味道,感觉还是加糖好一点,我干净利落的回答道,加。
public class MilletCongeeWithSugar implements MilletCongee {private final MilletCongee milletCongee;public MilletCongeeWithSugar() {this.milletCongee = new GeneralMilletCongee();}@Overridepublic void printIngredient() {System.out.println("糖");this.milletCongee.printIngredient();}}
这是加糖的小米粥,内部仍然是普通的小米粥,加了糖之后就产生了一个新的种类,叫加糖的小米粥。
直接点加糖的小米粥:
public class Order {public static void main(String[] args) {MilletCongee milletCongee=new MilletCongeeWithSugar();milletCongee.printIngredient();}}
拿到加糖的小米粥尝了一口,嗯正合我意,香甜可口的一碗小米粥下肚,又是一个元气满满的早晨。
区别
装饰器模式和代理模式,都是对原对象进行包装,都需要用到原对象的实例,他们的区别主要在于对外的表现不同。
装饰器模式:点了小米粥,发现不好喝,然后用装饰器加了点糖。
MilletCongeemilletCongee=new GeneralMilletCongee();//点了一碗小米粥
milletCongee=newSugarDecorator(milletCongee);//给小米粥加了点糖
代理模式:直接就点加了糖的小米粥
MilletCongeemilletCongee=new MilletCongeeWithSugar();
原创不易大家,点赞转发支持一下呀!
从一碗小米粥谈装饰器模式,代理模式的区别相关推荐
- OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
前言 前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式.单例模式.原型模式.接下来我将分享的是结构型模式! 一.适配器模式 1.1.适配器模式概述 适配器模式(Adapter ...
- Python中的闭包与装饰器及工厂模式
每日一怼:没想到你年纪轻轻就会用脸吓人了 笔者对闭包,装饰器及工厂模式的理解为使用函数的内置嵌调用. 我们先从比闭包开始去认知装饰器和工厂模式. 闭包:外部函数定义的内部函数就是闭包. 闭包的作用及好 ...
- 浅谈golang中的代理模式
来自一个大佬的博客,建议食用 设计模式不分语言,是一种思维层面的体现,但是不能在不同语言中使用同一套实现(每种语言有不同的特性),比如go,本身是没有继承一说,但是通过结构体的组合来实现语义上的继承. ...
- C++设计模式 | 四种结构型模式——代理模式、外观模式、适配器模式、装饰模式...
结构型模式:让类和类进行组合,获得更大的结构. 代理模式 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端 ...
- 设计模式 — 结构型模式 — 代理模式
目录 文章目录 目录 代理模式 应用场景 代码示例 代理模式 代理模式,为其他对象提供一种代理,以此控制一个对象的访问方式.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户 ...
- create-react-app 配置scss,ant-design,装饰器,代理,node支持最新语法,express es6 后端,链接mongodb...
新建一个项目 npm install -g create-react-app create-react-app my-app cd my-app npm i npm start # 或者,npm 5. ...
- 设计模式(装饰者模式外观模式代理模式)
目录 装饰者模式 介绍 实现 外观模式 介绍 实现 代理模式 介绍 实现 装饰者模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设 ...
- python装饰器两层和三层区别_学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)...
06.01自我总结 一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头 ...
- 浅谈java的静态代理模式
嗨喽-小伙伴们XX好呀, 本章我们来介绍,java中出现的静态代理模式. 代理,对应于英语单词-----Proxy,从字面上理解,就是在实现代理目标(Target)所有的需求的同时,还能够实现代理目标 ...
最新文章
- [Android]用架构师角度看插件化(2)-Replugin 唯一hook点
- 一元流量参数为null_为什么牛逼的程序员都不用 “ ! = null quot; 做判空?
- 离散分布概率:几何分布、二项分布和泊松分布
- python设置文件编码_python批量修改文件编码格式的方法
- 如何生成全局唯一标识
- oracle数据库字符编码utf-8改为ZHS16GBK
- Linux中使用netstat命令的基本操作,排查端口号的占用情况
- Mysql过长的Sql语句优化:在循环中调用存储过程运行动态语句
- python小白从哪来开始-python入门小白的困惑,怎么入门python?
- android 组件重用,Android提高显示布局文件的性能,使用include标签重用layouts
- python--弦图
- 基于 Java 机器学习自学笔记 (第66至68天:主动学习之ALEC)
- 微商怎么做推广加好友?教你几招,让你天天涨粉
- 不服!女性为何成为科技领域的“隐形人”?讲讲崛起中的“她”力量
- 常用音频接口简介(PDM/PCM/IIS/SLIMBUS)
- [数字图像处理]频域滤波(2)--高通滤波器,带阻滤波器与陷波滤波器
- wangEditor + vue双向绑定(光标游走问题)
- OSPF-LSA详解
- 设备指纹之安全性详解
- LeetCode刷题第8天字符串系列之《378字符串中的第一个唯一字符》
热门文章
- 这里有一份最新的课程分享清单,收集好久了,请查收
- Integer.toHexString((byteVar 0x000000FF) | 0xFFFFFF00).substring(6)解释
- java接听电话freeswitch,FreeSWITCH--配置代接电话
- 默认使用Adobe Acrobat DC打开设置
- 酷q服务器信息获取,酷Q获取加群QQ等级的解决方案
- 什么是域名流量劫持?
- 数据库原理及应用学习笔记
- 学习OpenMV(一)详细参数及简单介绍
- Android 百度地图之路径规划
- 小程序安卓和ios使用自定义字体,解决安卓不生效问题