Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43179 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

第14讲 | 谈谈你知道的设计模式?

杨晓峰 2018-06-05
设计模式是人们为软件开发中相同表征的问题,抽象出的可重复利用的解决方案。在某种程度上,设计模式已经代表了一些特定情况的最佳实践,同时也起到了软件工程师之间沟通的“行话”的作用。理解和掌握典型的设计模式,有利于我们提高沟通、设计的效率和质量。
今天我要问你的问题是,谈谈你知道的设计模式?请手动实现单例模式,Spring 等框架中使用了哪些模式?

典型回答

大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)。
结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构型模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)等。
行为型模式,是从类或对象之间交互、职责划分等角度总结的模式。比较常见的行为型模式有策略模式(Strategy)、解释器模式(Interpreter)、命令模式(Command)、观察者模式(Observer)、迭代器模式(Iterator)、模板方法模式(Template Method)、访问者模式(Visitor)。

考点分析

这个问题主要是考察你对设计模式的了解和掌握程度,更多相关内容你可以参考:https://en.wikipedia.org/wiki/Design_Patterns。
我建议可以在回答时适当地举些例子,更加清晰地说明典型模式到底是什么样子,典型使用场景是怎样的。这里举个 Java 基础类库中的例子供你参考。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(36)

  • 公号-代码荣耀
    门面模式形象上来讲就是在原系统之前放置了一个新的代理对象,只能通过该对象才能使用该系统,不再允许其它方式访问该系统。该代理对象封装了访问原系统的所有规则和接口方法,提供的API接口较之使用原系统会更加的简单。

    举例:JUnitCore是JUnit类的 Facade模式的实现类,外部使用该代理对象与JUnit进行统一交互,驱动执行测试代码。

    使用场景:当我们希望封装或隐藏原系统;当我们使用原系统的功能并希望增加一些新的功能;编写新类的成本远小于所有人学会使用或者未来维护原系统所需的成本;

    缺点:违反了开闭原则。如有扩展,只能直接修改代理对象。

    作者回复: 不错

    2018-06-05
    38
  • 南北少卿
    为什么我去查Runtime的源码,currentRuntime没有被final修饰呢?

    作者回复: 什么版本?我这是最新的

    2018-06-05
    20
  • 云学
    最开始迷恋设计模式,后来眼中没有模式,其实那本经典的设计模式的书的第一章就非常明确的指出设计模式不是银弹,总感觉java语言写的程序比c++更重,很多代码都是无用的装饰
    2018-06-09
    15
  • 田维俊
    公司项目是一个基于spingboot、mybatis开发的web后端管理项目。现在的问题是 不同角色登录到系统看到的模块和模块里面的数据是不一样的,有时虽然看到的模块一样,但是由于角色不一样,所以显示的数据是不一样,在这样的情况下,会经常在service层方法里面判断角色然后改变mapper的数据操作条件或调用mapper的不同方法。由于在service层频繁的判断角色感觉很不雅,新增角色就要加判断,哎,感觉可以用策略设计模式,可是不知道怎么具体设计。
    2018-06-06
    10
  • sunlight001
    结合流行的开源框架,或者自己的项目学设计模式是很好的办法,生学很容易看不懂学不下去,xxxfascade是门面模式,为复杂的逻辑提供简单的借口,设计模式学的时候还能明白,但是用的时候就不知道该怎么用了,我们怎么在项目中使用设计模式呢?

    作者回复: 不必为了模式而用,优先解决开发、维护中的痛点

    2018-06-05
    9
  • Walter
    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。
    这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

    意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
    主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。
    何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。
    如何解决:客户端不与系统耦合,外观类与系统耦合。
    关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
    应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。
    优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
    缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
    使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。
    注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。

    作者回复: 不错,业务系统多见

    2018-06-07
    7
  • yearning
    Facade(外观模式)
    接口隔离模式。处理组件中外部客户程序和组件中各种复杂的子系统高耦合情况,定义一个高层接口,为子系统中的一组接口提供一个一致(稳定)的界面,使得更简单的使用。
    facade简化整个组件系统的接口,同时子系统的任何变化都不会影响到facade接口。

    有一个更简单的称呼,门面模式,打个比方说,你去商店,你只需要告诉店员,你需要什么,至于商店中复杂的采购系统,库存系统,收银系统一概对你不可见。

    在经常使用的hibernate,当我们想插入一条用户信息,facade接口中insert(User user),我们只要传递User对象,至于背后的操作对外部调用是不可见。

    facade模式是从架构的层次去看整个系统,而是一两个类之间单纯解耦。
    2018-06-05
    6
  • 李志博
    Spring 内部的asm 模块 用到了访问者模式
    2018-06-05
    5
  • 润兹
    在没用facade之前,为了完成某个功能需要调用各子系统的各方法进行组合才能完成,用了facade之后相当于把多个方法调用聚合成了一个方法,方便用户调用。
    2018-06-05
    4
  • So Leung
    屏蔽掉复杂的系统,提供一个对外的简单的接口供别人调用,比如某个人想开一家商店可能要去很多的部门审批手续,比如税务、公司、卫生等等。但是有一天这些部门提供了一个统一的窗口,大家通过这个窗口可以办完所以的流程。这就是外观模式的一个现实抽象。

    作者回复: 很形象

    2018-08-29
    3
  • 星空
    外观模式为子系统中一组接口提供一个统一访问的接口,降低了客户端与子系统之间的耦合,简化了系统复杂度。缺点是违反了开闭原则。适用于为一系列复杂的子系统提供一个友好简单的入口,将子系统与客户端解偶。公司基础paas平台用到了外观模式,具体是定义一个ServiceFacade,然后通过继承众多xxService,对外提供子xxService的服务。

    作者回复: 业务开发很普遍

    2018-06-05
    3
  • Sin0
    有一点理解不太一致,单例模式double check中synchronized就已经可以提供可见性,volatile的作用主要体现在禁指令重排!

    作者回复: 不冲突,sync也不是必然走到

    2018-06-05
    3
  • 君莫惜
    外观模式是定义一个高层接口来更方便的去调用低层接口,比如mvc,service的接口就是高层接口,而dao中就是低层接口

    作者回复: 是的

    2019-01-08
    1
  • clz1341521
    facade门面模式,为了减少对子线实现的依赖,将子类实现统一封装。实现调用封装类。达到所谓的“封装交互,简化调用”
    2018-08-05
    1
  • Miaozhe
    我理解Facada模式,微服务应用场景,如:Nginx对系统子服务进行管理和IP反向代理,提供统一的服务,就是屏蔽外部系统对内部服务的具体实现,以及各微服务的部署虚拟机和URL。
    再者,容器Docker技术,我认为这是Facada模式,通过镜像把应用相关的组件和配置都预置好,发布这个服务时,直接启动容器,用户不用关心里面的任何细节。

    杨老师看看,我分析的对吗?
    2018-06-08
    1
  • softpower2018
    通过封装的方式,对外屏蔽内部复杂业务逻辑,实现使用方与具体实现的分离。门面模式
    2018-06-05
    1
  • Geek_028e77
    facade模式 主要屏蔽系统内部细节实现,通过facade模式封装统一的接口 提供给外部调用着.有一个优势 ,当内部系统做变更 优化时,这对外部调用者来说是透明的,一定程度上降低了系统间耦合性...个人理解
    2018-06-05
    1
  • wutao
    Spring中还用到了策略模式吧

    作者回复: 当然,列出的只是简要说明

    2018-06-05
    1
  • 西兹兹
    不认同老师说的内部类实现单例不好。 双检索加volatile模式个人不看好,因为外部调用执行影响cpu缓存行和指令冲排序优化
    2019-11-10
  • Paul Shan
    facade是封装思想的具体实现,一个实现类或者一套已有系统,开放出来的接口可能庞杂,这个时候很可能需要一层来简化其操作,提供友好界面。facade就是在这种场景下使用。早期计算机操作系统,Unix在性能和可扩展等关键指标远胜Windows,但是就是提供的命令行界面有点复杂,对普通人不太友好,最后被Windows逆袭。
    2019-11-07
收起评论
36
返回
顶部