装饰器和代理模式的区别,从一碗小米粥谈起
时间:2022-07-24
本文章向大家介绍装饰器和代理模式的区别,从一碗小米粥谈起,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理与装饰器
场景描述
代理即代替意思,可替代原类的所有功能,即和原类实现相同的规范。代理模式和装饰器模式很像。
每天清晨起来,紧张的洗漱之后,来到楼下的早餐店,我通常都会要一碗小米粥,这时候盛粥的大姐姐通常会问一句加不加糖,我回答不加,这时候我就会得到一碗热腾腾香喷喷的小米粥。
基础实现
一个小米粥的接口:
publicinterface MilletCongee {
/**
* 打印小米粥中含有的成分
*/
void printIngredient ();
}
默认的不加糖的小米粥的实现:
publicclass GeneralMilletCongee implements MilletCongee{
@Override
publicvoid printIngredient() {
System.out.println("不加糖的小米粥,组成成分是小米和水");
}
}
点餐:
publicclass Order{
publicstaticvoid main(String[] args) {
MilletCongee milletCongee=new GeneralMilletCongee();
milletCongee.printIngredient();
}
}
一碗小米粥,不加糖:
装饰器模式
得到一碗热腾腾香喷喷的小米粥,尝了一口,感觉不是很好喝,接着又尝了一口,嗯感觉还是加点糖比较好,于是我又来到盛小米粥的大姐姐旁边,让她帮我加了点糖。
/**
* 糖装饰器,用来给小米粥加糖
*/
publicclass SugarDecorator implements MilletCongee {
/**
* 拥有的小米粥对象
*/
privatefinal MilletCongee milletCongee;
public SugarDecorator(MilletCongee milletCongee) {
this.milletCongee = milletCongee;
}
@Override
publicvoid printIngredient() {
System.out.println("糖");
this.milletCongee.printIngredient();
}
}
大姐姐把加好糖的小米粥重新递给了我,尝了一口,嗯真是香甜可口。
publicclass Order {
publicstaticvoid main(String[] args) {
MilletCongee milletCongee=new GeneralMilletCongee();
milletCongee=new SugarDecorator(milletCongee);
milletCongee.printIngredient();
}
}
看了一下小米粥的成分,加上了糖。
注意这两行:
MilletCongeemilletCongee=new GeneralMilletCongee();//点了一碗小米粥
milletCongee=newSugarDecorator(milletCongee);//给小米粥加了点糖
装饰器模式适合什么场景呢?假设我有一个对象,但是这个对象的功能不能令我满意,我想给他加上一些功能,如何才能实现呢,那我就拿装饰器给他装饰一下就ok了。
代理模式
第二天早上,吃早餐的时候我又点了一碗小米粥,这时候盛粥的大姐姐抛出了昨天同样的问题给我,加不加糖?想起昨天的情景和味道,感觉还是加糖好一点,我干净利落的回答道,加。
publicclass MilletCongeeWithSugar implements MilletCongee {
privatefinal MilletCongee milletCongee;
publicMilletCongeeWithSugar() {
this.milletCongee = new GeneralMilletCongee();
}
@Override
publicvoid printIngredient() {
System.out.println("糖");
this.milletCongee.printIngredient();
}
}
这是加糖的小米粥,内部仍然是普通的小米粥,加了糖之后就产生了一个新的种类,叫加糖的小米粥。
直接点加糖的小米粥:
publicclass Order {
publicstaticvoid main(String[] args) {
MilletCongee milletCongee=new MilletCongeeWithSugar();
milletCongee.printIngredient();
}
}
拿到加糖的小米粥尝了一口,嗯正合我意,香甜可口的一碗小米粥下肚,又是一个元气满满的早晨。
区别
装饰器模式和代理模式,都是对原对象进行包装,都需要用到原对象的实例,他们的区别主要在于对外的表现不同。
装饰器模式:点了小米粥,发现不好喝,然后用装饰器加了点糖。
MilletCongeemilletCongee=new GeneralMilletCongee();//点了一碗小米粥
milletCongee=newSugarDecorator(milletCongee);//给小米粥加了点糖
代理模式:直接就点加了糖的小米粥
MilletCongeemilletCongee=new MilletCongeeWithSugar();
- React Native之常用第三方库
- React Native和Android整合详解
- 强大的API测试工具Hitchhiker v0.9 基于UI的断言测试,回顾2017
- WEB前端架构(二)
- WEB前端架构(三)
- node.js基本工作原理及流程
- Github+Jekyll搭建个人博文网站
- Ecmascript语法之Symbol
- 区块链的java实现
- gitlab操作指南
- 如何构建智能反垃圾邮件WordPress插件
- 在Mac上搭建React Native开发环境
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide图片缓存库的联系与区别
- React Native之StyleSheet样式表
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 从 SVN 迁移到 Git
- 在 Windows 系统上配置 Apache Git 服务器
- WMCTF2020 部分Writeup&招新帖
- 【DB宝15】生产环境中,如何利用DG的备库来异机还原一个新库?
- Java命令执行学习笔记
- SAP UI5应用DatePicker控件的设计明细
- 如何根据自己的实际需求开发属于自己的sublime text插件
- Sony Z13 系列笔记本安装 NVIDIA 官方最新版显卡驱动程序
- 通过网页进行 iOS 应用内部分发
- 【DB笔试面试853】在Oracle中,什么是手动建库?手动建库有哪些步骤?
- 使用 Intel HAXM 为 Android 模拟器加速,媲美真机
- NHibernate 使用 SqlQuery
- 谈谈 INotifyPropertyChanged 的实现
- C 语言小知识
- 使用代码配置 NHibernate