Table of Contents generated with DocToc

  • 23种设计模式彩图
  • 动态代理和静态代理
    • 静态代理
    • 动态代理
    • 静态代理与动态代理的区别
    • JDK中的动态代理和CGLIB
    • 实现动态代理的方案有下列几种

设计模式主要分三个类型:创建型、结构型和行为型。

创建型

  1. Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
  2. Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
  3. Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
  4. Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
  5. Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

行为型

  1. Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
  2. Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
  3. Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
  4. Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
  5. State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
  6. Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
  7. China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
  8. Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
  9. Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
  10. Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
  11. Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

结构型

  1. Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
  2. Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
  3. Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
  4. Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
  5. Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
  6. Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
  7. Flyweight,享元模式

23种设计模式彩图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-De9NhaJZ-1607192640841)(E:\学习\写作\别人的文章\最近可抄\Java-Summarize-master\image/design-1.jpg)]

动态代理和静态代理

静态代理

这种代理方式需要代理对象和目标对象实现一样的接口。在程序运行前,代理类的.class文件就已经存在了。

优点:

  1. 可以在不修改目标对象的前提下扩展目标对象的功能。

缺点:

  1. 冗余。程序员要手动为每一个目标类编写对应的代理类。 为现有的每一个类都编写一个对应的代理类,并且让它实现和目标类相同的接口
  2. 不易维护。一旦接口增加方法,目标对象与代理对象都要进行修改。静态代理的缺陷

动态代理

动态代理利用了JDK API,运用反射机制动态地在内存中构建代理对象,从而实现对目标对象的代理功能。动态代理又被称为JDK代理或接口代理。

动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象

优点:

  1. 动态代理对象不需要实现接口,但是要求目标对象必须实现接口,否则不能使用动态代理。

静态代理与动态代理的区别

  1. 静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
  2. 动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
  3. 静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
  4. 静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。

JDK中的动态代理和CGLIB

动态代理

  1. JDK中的动态代理: 通过反射类Proxy以及InvocationHandler回调接口实现的,

  2. 动态代理缺点: JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。

CGLIB

  1. CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。

  2. CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

  3. CGLIB优点:它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。

  4. CGLIB缺点:对于final方法,无法进行代理

实现动态代理的方案有下列几种

  • jdk 动态代理
  • cglib 动态代理
  • javassist 动态代理
  • ASM 字节码
  • javassist 字节码

设计模式面试复习,为你的春招做准备!相关推荐

  1. JVM面试知识点合集 — Android 春招 2022

    JVM面试知识点合集 - Android 春招 2022 星光不问赶路人,时间不负有心人 Tips:文章较长,可以在侧栏目点击子标题,快速跳转 喜欢的话,就一键三连吧

  2. 阿里JAVA实习生面试总结(2019年春招)

    开篇 首先说说结果.前三面通过,最后HR面挂掉了.一路走来虽然跌跌撞撞,但是收获颇多.写一篇博客记录一下自己的阿里面试之路. 提一下背景,双非渣本大三,大一大二学C/C++,大三开始学Java,有参加 ...

  3. 在 2020 秋招中没有取得理想的 offer,可以提前为2021春招做哪些准备?

    目录 1.因为考研/实习/留学等各种原因错过了秋招. 2. 盲目海投真的不能帮你找到好工作. 3. "放弃大厂"不代表认怂. 4. 别只盯着那些听过名字的公司. 5. 早点投递!! ...

  4. 2018春招实习笔试面试总结(PHP)

    2018春招实习笔试面试总结(PHP) 博主双非渣本计算机软件大三狗一枚,眼看着春招就要结束了,现将自己所经历的的整个春招做一个个人总结. 首先就是关于投递计划,博主自己整理了一份各大公司的春招信息, ...

  5. 关于春招 秋招面试的一些经验

    2019 年第 24 篇,总 48 篇文章 本文大约 5000 字,阅读大约需要 15 分钟 周末了,就不写技术了,来聊聊关于春招/秋招面试的事情,刚好最近也是逐渐开始春招找实习或者找工作的时候了,我 ...

  6. 【面试招聘】美团+阿里 | 机器学习算法春招面经

    文章来源于NewBeeNLP,作者今天你leetcode 写在前面 2020春招实习投的职位都是机器学习算法工程师,这里主要说一下拿到offer的两家面试: 阿里云 (4.1 笔试0ac,对了10%, ...

  7. 【java后台面经】春招秋招求职大佬面试经验分享

    java后台面试经验分享 根据春招秋招的亲身经历细心总结 包括各大公司面试题目和面试小贴士 携程 jvm线程和操作系统线程区别 jvm栈和堆分别放什么 oom可能出现的情况 如何排查oom 项目中未登 ...

  8. 2018届春招面试回顾(三)

    前言 前两篇分别介绍了网易和腾讯的面试,这两家公司作为国内游戏行业数一数二的公司,它们的面试流程相对固定,问题也比较常规,当然对面试者的要求也非常高.在2018届的春招中,除了腾讯网易外,我还参加了Y ...

  9. 2019秋招|从春招到秋招,Java岗经验总结(收获AT)

    前言 找工作是一件辛酸而又难忘的历程.经历过焦虑.等待.希望,我们最终都能去到属于自己理想的地方. 从春招到秋招,我总计面试了数十家公司.春招面试了腾讯.去哪儿.360.小米.携程.华为.今日头条.美 ...

最新文章

  1. python使用openCV把原始彩色图像转化为灰度图、使用矩阵索引的方式对数据数据进行剪裁(image cropping)
  2. 通过构建DCA(Decision Curve Analysis)模型、获取模型数据并使用python进行绘图
  3. 服务器设置为自动登录,Windows Server 2008 R2怎样设置自动登陆(登录)
  4. cleaning selected projects has encountered a problem errors occurred during build
  5. oracle 10g中没有refhost.xml,解决win7 安装oracle10g的问题
  6. 星级评分--演进式部署
  7. Linux中级之netfilter/iptables应用及补充
  8. openCV 下载地址
  9. 亚马逊买家多账号如何运行管理?
  10. java怎么使用sni,如何设置使用SNI提供两个SSL证书的Tomcat?
  11. 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object)
  12. Spamhaus -影响最大的RBL(实时黑名单列表)服务提供商,非营利性组织
  13. 关于 Vue.js 的那些事儿
  14. C++实现银行贷款等额本息和等额本金还款
  15. Pycharm完整中文教程及安装配置
  16. JavaScript RegExp 正则对象
  17. 相似图片搜索的三种哈希算法
  18. 安卓android获取存储路径,Android系统的手机文件夹目录详解
  19. twitter 推出官方 Android 客户端
  20. 计算机组成原理设计,计算机组成原理课程设计

热门文章

  1. OCR文字识别:深度学习算法识别步骤
  2. 名帖45 北魏 楷书《元显儁墓志》
  3. 双11营业额实时数据_天猫双11期间实时成交额刚刚突破3723亿
  4. 一个简单的CPU降温方法.
  5. html5线性渐变方向,使用canvas来完成线性渐变和径向渐变的功能的方法示例
  6. MacBook Pro如何调整键盘背光(带touch bar)?
  7. Android的Monkey测试
  8. DP问题各种模型的状态转移方程
  9. android 使用网络连接adb(需Root)
  10. 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)