代理与装饰器


场景描述

代理即代替意思,可替代原类的所有功能,即和原类实现相同的规范。代理模式和装饰器模式很像。

每天清晨起来,紧张的洗漱之后,来到楼下的早餐店,我通常都会要一碗小米粥,这时候盛粥的大姐姐通常会问一句加不加糖,我回答不加,这时候我就会得到一碗热腾腾香喷喷的小米粥。

基础实现

一个小米粥的接口:

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();

原创不易大家,点赞转发支持一下呀! 

从一碗小米粥谈装饰器模式,代理模式的区别相关推荐

  1. OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式

    前言 前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式.单例模式.原型模式.接下来我将分享的是结构型模式! 一.适配器模式 1.1.适配器模式概述 适配器模式(Adapter ...

  2. Python中的闭包与装饰器及工厂模式

    每日一怼:没想到你年纪轻轻就会用脸吓人了 笔者对闭包,装饰器及工厂模式的理解为使用函数的内置嵌调用. 我们先从比闭包开始去认知装饰器和工厂模式. 闭包:外部函数定义的内部函数就是闭包. 闭包的作用及好 ...

  3. 浅谈golang中的代理模式

    来自一个大佬的博客,建议食用 设计模式不分语言,是一种思维层面的体现,但是不能在不同语言中使用同一套实现(每种语言有不同的特性),比如go,本身是没有继承一说,但是通过结构体的组合来实现语义上的继承. ...

  4. C++设计模式 | 四种结构型模式——代理模式、外观模式、适配器模式、装饰模式...

    结构型模式:让类和类进行组合,获得更大的结构. 代理模式 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端 ...

  5. 设计模式 — 结构型模式 — 代理模式

    目录 文章目录 目录 代理模式 应用场景 代码示例 代理模式 代理模式,为其他对象提供一种代理,以此控制一个对象的访问方式.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户 ...

  6. 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. ...

  7. 设计模式(装饰者模式外观模式代理模式)

    目录 装饰者模式 介绍 实现 外观模式 介绍 实现 代理模式 介绍 实现 装饰者模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设 ...

  8. python装饰器两层和三层区别_学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)...

    06.01自我总结 一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头 ...

  9. 浅谈java的静态代理模式

    嗨喽-小伙伴们XX好呀, 本章我们来介绍,java中出现的静态代理模式. 代理,对应于英语单词-----Proxy,从字面上理解,就是在实现代理目标(Target)所有的需求的同时,还能够实现代理目标 ...

最新文章

  1. [Android]用架构师角度看插件化(2)-Replugin 唯一hook点
  2. 一元流量参数为null_为什么牛逼的程序员都不用 “ ! = null quot; 做判空?
  3. 离散分布概率:几何分布、二项分布和泊松分布
  4. python设置文件编码_python批量修改文件编码格式的方法
  5. 如何生成全局唯一标识
  6. oracle数据库字符编码utf-8改为ZHS16GBK
  7. Linux中使用netstat命令的基本操作,排查端口号的占用情况
  8. Mysql过长的Sql语句优化:在循环中调用存储过程运行动态语句
  9. python小白从哪来开始-python入门小白的困惑,怎么入门python?
  10. android 组件重用,Android提高显示布局文件的性能,使用include标签重用layouts
  11. python--弦图
  12. 基于 Java 机器学习自学笔记 (第66至68天:主动学习之ALEC)
  13. 微商怎么做推广加好友?教你几招,让你天天涨粉
  14. 不服!女性为何成为科技领域的“隐形人”?讲讲崛起中的“她”力量
  15. 常用音频接口简介(PDM/PCM/IIS/SLIMBUS)
  16. [数字图像处理]频域滤波(2)--高通滤波器,带阻滤波器与陷波滤波器
  17. wangEditor + vue双向绑定(光标游走问题)
  18. OSPF-LSA详解
  19. 设备指纹之安全性详解
  20. LeetCode刷题第8天字符串系列之《378字符串中的第一个唯一字符》

热门文章

  1. 这里有一份最新的课程分享清单,收集好久了,请查收
  2. Integer.toHexString((byteVar 0x000000FF) | 0xFFFFFF00).substring(6)解释
  3. java接听电话freeswitch,FreeSWITCH--配置代接电话
  4. 默认使用Adobe Acrobat DC打开设置
  5. 酷q服务器信息获取,酷Q获取加群QQ等级的解决方案
  6. 什么是域名流量劫持?
  7. 数据库原理及应用学习笔记
  8. 学习OpenMV(一)详细参数及简单介绍
  9. Android 百度地图之路径规划
  10. 小程序安卓和ios使用自定义字体,解决安卓不生效问题