今天面试聊到了模式。

面试官问:装饰者模式了解吗,讲一下?

我:blabla...

面试官:那代理模式呢?

我:blabla.....(说完感觉怎么都一样呢)

果然,面试官又问了:那两者有什么区别呢?

我: ....懵.........懵.........懵.........懵.........

首先呢来看一下定义。

一、代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问。代理模式是一项基本的设计技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上也采用了代理模式。

在代理模式中主要包含三个角色:

  1. 抽象主题角色Subject:是真实主题和代理主题的共同接口,以便在任何可以使用真实主题的地方都可以使用代理主题。
  2. 代理主题角色Proxy Subject:也叫做委托类、代理类,该角色负责控制对真实主题的引用,负责在需要的时候创建或删除真实主题对象,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
  3. 真实主题角色Real Subject:也叫做被委托角色、被代理角色,是业务逻辑的具体执行者。

二、装饰者模式

装饰者模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。

装饰模式有以下4个角色。

  1. 抽象构件(Component)角色:该角色用于规范需要装饰的对象(原始对象)。
  2. 具体构件(Concrete Component)角色:该角色实现抽象构件接口,定义一个需要装饰的原始类。
  3. 装饰(Decorator)角色:该角色持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
  4. 具体装饰(Concrete Decorator)角色:该角色负责对构件对象进行装饰。

三、区别

从定义上看似乎能够回答面试官的问题,一个是用于实现访问控制,一个是增加功能。可是。。访问控制是什么,增加功能又是怎么样的?到底啥是佩琪,还是要搞清楚些,看一些具体的例子来了解下。

3.1 访问控制 -- 代理模式

// 抽象主题
interface AbstractSubject{void doAction();
}// 真实主题
class RealSubject implements AbstractSubject{@Overridepublic void doAction() {System.out.println(" Real Action ");}
}// 代理主题
class ProxySubject implements AbstractSubject{private AbstractSubject subject;public ProxySubject(){this.subject = new RealSubject();}@Overridepublic void doAction() {System.out.println(" Before Proxy do Action");subject.doAction();System.out.println(" Before Proxy do Action");}
}// 客户端
public class Client{public static void main(String[] args) {AbstractSubject subject = new ProxySubject();subject.doAction();}
}

3.2 功能扩展 -- 装饰者模式

// 抽象构件
interface Human{void eat();
}// 具体构件
class Baby implements Human{@Overridepublic void eat() {System.out.println("Baby eating");}
}// 装饰角色
class Guardian implements Human{private Human human;public Guardian(Human h){human = h;}@Overridepublic void eat() {human.eat();}
}// 具体装饰角色
class Parent extends Guardian{public Parent(Human h) {super(h);}@Overridepublic void eat() {System.out.println("Wash hands for baby");super.eat();}
}// 客户端
Baby baby = new Baby();
Human human = new Parent(baby);
human.eat();

四、总结

等待,看完例子怎么感觉又似懂非懂了呢。不是说一个控制访问,一个增强功能吗,为什么都是中间类和目标类实现了相同的接口,在调用目标类时增加了自己的方法呢?好像确实又懵了。

其实,代理模式的访问控制主要在于对目标类的透明访问,也就是说我们不需要知道目标类的具体情况,只需要知道代理类可以帮助我们完成想要的功能就对了;而对于装饰者模式,我们是有一个目标类的对象的,比如例子中的baby,这个对象可以完成特定的功能(eat),但是不能满足我们的要求,所以需要对其进行增强(饭前洗手)。

也就是说,在代理模式中,目标类对于客户端是透明的,由代理类隐藏其具体信息并响应客户端请求;而装饰者中客户端对特定的目标类对象进行增强。所以,代理类与真实对象的关系常在编译时就确定,而装饰者在运行时递归构造。

----------

终于搞明白了这两个相似的设计模式的关系,好像智商又占领了高地,就是脚有点麻   ------

面试官问:代理模式和装饰者模式有啥区别相关推荐

  1. 面试官问我:spring、springboot、springcloud的区别,我笑了

    好吧,可能某些项目还在使用dubbo,但是你也一定听过Spring Cloud.至于Spring和Spring Boot,对于现在的Java开发,它们的地位简直可以说是不可或缺了.如果你的新项目在使用 ...

  2. 【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:00 更新文章,每天进步一点点... 1.组 ...

  3. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  4. 面试官问你MyBatis中有哪些设计模式,把这篇文章发给他

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 疯狂的蚂蚁 来源 | https://dwz.cn/KFgol1De 之前总结过一篇Spring中用到了哪些设计模式:<面试官 ...

  5. 面试官问:在读多写少的情况下,如何优化 MySQL 的数据查询方案

    作者 | 面试官问     责编 | 张文 来源 | 面试官问(ID:interviewer_asked) 面试官问:假设你负责的某业务在双十一期间要搞运营活动,公司投入了大量的营销费用进行推广,此举 ...

  6. 面试官问你想找什么工作_找工作时如何面试面试官

    面试官问你想找什么工作 在技​​术面试中要问的十二个问题 (Twelve questions to ask at tech interviews) I've just come off six wee ...

  7. 面试官问:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?

    以下文章来源方志朋的博客,回复"666"获面试宝典 最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多. 为了节约成本,定期进行数 ...

  8. eureka自我保护时间_阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默...

    文章首发:阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默 什么是服务注册? 首先我们来了解下,服务注册.服务发现和服务注册中心的之间的关系. 举个形象的例子,三者之间的关系就好像是供货 ...

  9. 面试官问:JS的this指向

    写于2018年12月25日,发布在掘金上阅读量近一万,现在发布到微信公众号申明原创. 前言 这是面试官问系列的第四篇,旨在帮助读者提升JS基础知识,包含new.call.apply.this.继承相关 ...

最新文章

  1. CentOS7下Docker Storage Pool扩容
  2. 数的补数 Number Complement
  3. Vue入门一、常用的指令
  4. 赛门铁克卸载工具_神奇的安卓恶意软件 xHelper:自卸载且无法删除
  5. 用于显示本地通知的跨平台插件flutter_local_notifications
  6. 集合-ArrayList
  7. 深圳学校积分计算机,深圳小学入学积分多少才够
  8. 6-12mysql库的操作
  9. C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究
  10. elasticsearch 部署
  11. 使用pthread-win32工程编译静态库
  12. JAVA 多线程学习总结
  13. openssl生成Windows证书
  14. sel - performSelector - NSSelectorFromString()
  15. 批处理注释bat注释一行_注释和注释处理器入门指南
  16. python操作word.7.19笔记
  17. Github上的一些优秀的知识图谱项目*
  18. 2021计算机会议截稿时间,ICCV 2021即将截稿、NeurIPS 大会征稿通知... | AI 顶会动态一览...
  19. 基于Open vSwitch的传统限速和SDN限速--实验
  20. linux非root用户如何将自己安装的python添加到环境变量

热门文章

  1. python股票趋势线_在Python中自动检测股票价格的高低并绘制趋势线
  2. iic键盘驱动 android,IIC的键盘驱动
  3. 机器学习基础-23:矩阵理论(L0/L1/L2范数等)
  4. 理科生在爱情上为什么总吃亏?
  5. python qt gui与数据可视化编程 kindle_Kindle Python教程 电子书 – Python数据可视化编程实战 PDF...
  6. html5+css3个人相册网页制作
  7. 树莓派玩黄油,编译运行ONScripter
  8. 电路专用计算机,基于AD977A的专用计算机数据采集电路的设计实现
  9. SharedObject对象聊天室
  10. GitHub 标星 6