ITPub博客

首页 > 应用开发 > Java > 设计模式常见面试知识点总结

设计模式常见面试知识点总结

原创 Java 作者:a724888 时间:2019-03-09 20:52:17 0 删除 编辑

微信公众号【Java技术江湖】一位阿里Java工程师的技术小站,致力于分享Java后端技术文章,以及这几年学习Java的心得体会,偶尔也记录在阿里成长的点滴,和大家一起在Java学习道路上成长。


作者:程序员江湖_陆小凤

设计模式

这篇总结主要是基于我设计模式系列的文章而形成的的。主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点。谢谢

更多详细内容可以到我的cdsn博客上查看: https://blog.csdn.net/a724888

最后,如果想要更好地完成这部分内容的学习,建议大家还是去看一下原文。

创建型模式

创建型模式 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但是需要提供给其他开发者用的时候。

单例


  1. 单例模式保证全局的单例类只有一个实例,这样的话使用的时候直接获取即可,比如数据库的一个连接,Spring里的bean,都可以是单例的。


  2. 单例模式一般有5种写法。


  3. 第一种是饿汉模式,先把单例进行实例化,获取的时候通过静态方法直接获取即可。缺点是类加载后就完成了类的实例化,浪费部分空间。


  4. 第二种是饱汉模式,先把单例置为null,然后通过静态方法获取单例时再进行实例化,但是可能有多线程同时进行实例化,会出现并发问题。


  5. 第三种是逐步改进的方法,一开始可以用synchronized关键字进行同步,但是开销太大,而后改成使用volatile修饰单例,然后通过一次检查判断单例是否已初始化,如果未初始化就使用synchronized代码块,再次检查单例防止在这期间被初始化,而后才真正进行初始化。


  6. 第四种是使用静态内部类来实现,静态内部类只在被使用的时候才进行初始化,所以在内部类中进行单例的实例化,只有用到的时候才会运行实例化代码。然后外部类再通过静态方法返回静态内部类的单例即可。


  7. 第五种是枚举类,枚举类的底层实现其实也是内部类。枚举类确保每个类对象在全局是唯一的。所以保证它是单例,这个方法是最简单的。


结构型模式




  1. 享元模式的核心在于享元工厂类,


  2. 享元工厂类的作用在于提供一个用于存储享元对象的享元池,


  3. 用户需要对象时,首先从享元池中获取,


  4. 如果享元池中不存在,则创建一个新的享元对象返回给用户,


  5. 在享元池中保存该新增对象。

代理模式


  1. 我们发现没有,代理模式说白了就是做 “方法包装” 或做 “方法增强”。


  2. 在面向切面编程中,算了还是不要吹捧这个名词了,在 AOP 中,


  3. 其实就是动态代理的过程。比如 Spring 中,

  4. 我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,


  5. 然后把我们定义在 @Before、@After、@Around 中的代码逻辑动态添加到代理中。

外观模式


  1. 外观模式一般封装具体的实现细节,为用户提供一个更加简单的接口。


  2. 通过一个方法调用就可以获取需要的内容。

组合模式


  1. 组合模式用于表示具有层次结构的数据,使得我们对单个对象和组合对象的访问具有一致性。


  2. 直接看一个例子吧,每个员工都有姓名、部门、薪水这些属性,


  3. 同时还有下属员工集合(虽然可能集合为空),

  4. 而下属员工和自己的结构是一样的,


  5. 也有姓名、部门这些属性,

  6. 同时也有他们的下属员工集合。


  7. class Employee {

  8.    private String name;

  9.    private String dept;

  10.    private int salary;

  11.    private List<Employee> subordinates; // 下属

  12. }

装饰者模式

装饰者

装饰者模式把每个增强类都继承最高级父类。然后需要功能增强时把类实例传入增强类即可,然后增强类在使用时就可以增强原有类的功能了。

和代理模式不同的是,装饰者模式每个装饰类都继承父类,并且可以进行多级封装。

行为型模式


  1. 行为型模式


  2. 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰。

策略模式


  1. 策略模式一般把一个策略作为一个类,并且在需要指定策略的时候传入实例,于是我们可以在需要使用算法的地方传入指定算法。

命令模式


  1. 命令模式一般分为命令发起者,命令以及命令接受者三个角色。


  2. 命令发起者在使用时需要注入命令实例。然后执行命令调用。


  3. 命令调用实际上会调用命令接收者的方法进行实际调用。


  4. 比如遥控器按钮相当于一条命令,点击按钮时命令运行,自动调用电视机提供的方法即可。

模板方法模式


  1. 模板方法一般指提供了一个方法模板,并且其中有部分实现类和部分抽象类,并且规定了执行顺序。


  2. 实现类是模板提供好的方法。而抽象类则需要用户自行实现。


  3. 模板方法规定了一个模板中方法的执行顺序,非常适合一些开发框架,于是模板方法也广泛运用在开源框架中。

观察者模式和事件监听机制


  1. 观察者模式一般用于订阅者和消息发布者之间的数据订阅。


  2. 一般分为观察者和主题,观察者订阅主题,把实例注册到主题维护的观察者列表上。


  3. 而主题更新数据时自动把数据推给观察者或者通知观察者数据已经更新。


  4. 但是由于这样的方式消息推送耦合关系比较紧。并且很难在不打开数据的情况下知道数据类型是什么。


  5. 知道后来为了使数据格式更加灵活,使用了事件和事件监听器的模式,事件包装的事件类型和事件数据,从主题和观察者中解耦。


  6. 主题当事件发生时,触发该事件的所有监听器,把该事件通过监听器列表发给每个监听器,监听得到事件以后,首先根据自己支持处理的事件类型中找到对应的事件处理器,再用处理器处理对应事件。

责任链模式


  1. 责任链通常需要先建立一个单向链表,然后调用方只需要调用头部节点就可以了,后面会自动流转下去。


  2. 比如流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动建立一条责任链,然后就可以开始流转了。


▼更多精彩内容

微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 



                     


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69906029/viewspace-2637969/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
微信公众号【程序员黄小斜】致力于让自学编程这件事变得更简单,授人以鱼也要授人以渔。作者自学编程转行互联网,目前是阿里巴巴Java工程师,专注于分享程序员前沿技术干货和编程学习心得,期待你的关注,和我们一起进步!

注册时间:2019-01-14

  • 博文量
    335
  • 访问量
    239615