第14讲 | 谈谈你知道的设计模式?
杨晓峰
该思维导图由 AI 生成,仅供参考
设计模式是人们为软件开发中相同表征的问题,抽象出的可重复利用的解决方案。在某种程度上,设计模式已经代表了一些特定情况的最佳实践,同时也起到了软件工程师之间沟通的“行话”的作用。理解和掌握典型的设计模式,有利于我们提高沟通、设计的效率和质量。
今天我要问你的问题是,谈谈你知道的设计模式?请手动实现单例模式,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/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了设计模式在软件开发中的重要性和实际应用。首先对创建型、结构型和行为型设计模式进行了概述,并以装饰器模式和构建器模式在Java中的应用为例进行了详细说明。此外,还涉及了设计模式在面试中可能涉及的问题,包括手动实现典型设计模式和结合标准库或主流开源框架使用设计模式的考察。文章还对单例设计模式进行了深入讨论,包括不同实现方式的优缺点和线程安全性的考量。通过对Java核心类库和主流开源框架的分析,展示了设计模式在实际项目中的应用场景。最后,强调了设计模式并非银弹,需要避免滥用或过度设计。整体而言,本文内容丰富,涵盖了设计模式的基本概念和实际应用,对读者了解设计模式的重要性和应用场景具有指导意义。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》,新⼈⾸单¥59
《Java 核心技术面试精讲》,新⼈⾸单¥59
立即购买
登录 后留言
全部留言(44)
- 最新
- 精选
- 公号-技术夜未眠门面模式形象上来讲就是在原系统之前放置了一个新的代理对象,只能通过该对象才能使用该系统,不再允许其它方式访问该系统。该代理对象封装了访问原系统的所有规则和接口方法,提供的API接口较之使用原系统会更加的简单。 举例:JUnitCore是JUnit类的 Facade模式的实现类,外部使用该代理对象与JUnit进行统一交互,驱动执行测试代码。 使用场景:当我们希望封装或隐藏原系统;当我们使用原系统的功能并希望增加一些新的功能;编写新类的成本远小于所有人学会使用或者未来维护原系统所需的成本; 缺点:违反了开闭原则。如有扩展,只能直接修改代理对象。
作者回复: 不错
2018-06-05294 - Walter外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。 何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。 如何解决:客户端不与系统耦合,外观类与系统耦合。 关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。 应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。 优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。 缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。 使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。 注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。
作者回复: 不错,业务系统多见
2018-06-07434 - 南北少卿为什么我去查Runtime的源码,currentRuntime没有被final修饰呢?
作者回复: 什么版本?我这是最新的
2018-06-05423 - So Leung屏蔽掉复杂的系统,提供一个对外的简单的接口供别人调用,比如某个人想开一家商店可能要去很多的部门审批手续,比如税务、公司、卫生等等。但是有一天这些部门提供了一个统一的窗口,大家通过这个窗口可以办完所以的流程。这就是外观模式的一个现实抽象。
作者回复: 很形象
2018-08-29214 - sunlight001结合流行的开源框架,或者自己的项目学设计模式是很好的办法,生学很容易看不懂学不下去,xxxfascade是门面模式,为复杂的逻辑提供简单的借口,设计模式学的时候还能明白,但是用的时候就不知道该怎么用了,我们怎么在项目中使用设计模式呢?
作者回复: 不必为了模式而用,优先解决开发、维护中的痛点
2018-06-0514 - BreezeSzp有一点理解不太一致,单例模式double check中synchronized就已经可以提供可见性,volatile的作用主要体现在禁指令重排!
作者回复: 不冲突,sync也不是必然走到
2018-06-057 - 星空外观模式为子系统中一组接口提供一个统一访问的接口,降低了客户端与子系统之间的耦合,简化了系统复杂度。缺点是违反了开闭原则。适用于为一系列复杂的子系统提供一个友好简单的入口,将子系统与客户端解偶。公司基础paas平台用到了外观模式,具体是定义一个ServiceFacade,然后通过继承众多xxService,对外提供子xxService的服务。
作者回复: 业务开发很普遍
2018-06-056 - 君莫惜外观模式是定义一个高层接口来更方便的去调用低层接口,比如mvc,service的接口就是高层接口,而dao中就是低层接口
作者回复: 是的
2019-01-0824 - wutaoSpring中还用到了策略模式吧
作者回复: 当然,列出的只是简要说明
2018-06-052 - 云学最开始迷恋设计模式,后来眼中没有模式,其实那本经典的设计模式的书的第一章就非常明确的指出设计模式不是银弹,总感觉java语言写的程序比c++更重,很多代码都是无用的装饰2018-06-09433
收起评论