面向对象 - 设计模式【快速复习版本】
Overview
①设计模式根据解决问题类型不同分为:1.创建型 2.结构型 3.行为型 。
②设计模式是pattern,它是解决类似问题的一种好的沉淀方法论,比如正则表达式可以解决模板字符串匹配的问题。
③设计模式是语言无关的,最早参考自建筑学设计模式
参考链接:重学Java设计模式
一、创建型(Creational Patterns)
目的:解决对象创建过程中的问题,比如对象线程安全、建造过程复杂、对象实例子类类型、对象实例簇、创建成本问题。
单例模式(Singleton)
全局访问点、全局实例
举例:初始化的private static final
举例:懒加载获取的单例对象,全局opencv识别模型管理器
建造者模式(Builder)
@Builder
工厂方法模式(Factory Method)
支付系统中,根据不同的支付方式使用工厂方法模式创建不同的支付处理器
抽象工厂模式(Abstract Factory)
GUI框架中,使用抽象工厂模式创建不同操作系统下的用户界面控件
原型模式(Prototype)
复制复杂对象时,如复制用户会话信息,使用原型模式。
二、结构型(Structural Patterns)
关注点:结构型模式主要关注对象和类的组合方式。结构型模式通过提供新的类和对象的组织方式来解决特定问题。
适配器模式(Adapter)
集成第三方支付接口时,使用适配器模式将第三方API适配到内部支付处理流程。
定义标准接口,外部服务实现接口,进行适配
装饰器模式(Decorator)
BufferedOutputStream(OutputStream out)
“装饰模式”是通过构造器层层嵌套的形式、增强功能
代理模式(Proxy)
Spring AOP
声明式编程 ①Mybatis的Mapper实现 ②OpenFeign的具体实现
更偏向是访问控制
外观模式(Facade)
在复杂的业务系统中,提供一个简单的API接口,隐藏背后的复杂性。
桥接模式(Bridge)
能够将能力组合在一起使用
微信 + 指纹 = 支付
组合模式(Composite)
通过把相似对象(也可以称作是方法)组合成一组可被调用的结构树对象的设计思路叫做组合模式。
享元模式(Flyweight)
String的虚拟机层面的底层存储
三、行为型(Behavioral Patterns)
关注点:行为型模式主要关注对象之间的通信和协作。这些模式提供了对象和类之间的相互作用以及它们在系统中的责任分配方案。
策略模式(Strategy Pattern)
Context是一个中间层,进行了客户端和策略的解耦、还可以进行运行时的注入和策略替换、甚至是策略链等。
策略的实现是通过多态实现。
应用场景:不同的算法/规则导致不同的结果。
观察者模式(Observer Pattern)
Spring的 @EventListener
类似发布订阅,但是缺少了Broker
迭代器模式(Iterator Pattern)
java.lang.Iterable
责任链模式(Chain of Responsibility Pattern)
策略算法 + 责任链 组合策略算法链
Filter Interceptor
审批流、工作流、权限验证
命令模式(Command Pattern)
发起命令的执行命令的端进行解耦。
DDD编程的命令模式
备忘录模式(Memento Pattern)
备忘录模式用于操作回滚,一般前端会用到,操作向前或者向后。
访问者模式(Visitor Pattern)
Antlr的具体实现:https://www.antlr.org/
同一份数据不同的访问视角
Fruit、Jsoup
AST语法树
中介者模式(Mediator Pattern)
中介者模式主要用于减少多个对象或类之间的交互复杂性,通过引入一个中介者对象来封装多个对象之间的通信。
状态模式(State Pattern)
COLA statemachine
Spring statemachine
调证、机审、系统审核的状态模式应用
模板方法模式(Template Method Pattern)
DSL + 模板类实现功能配置化
Spring AbstractApplicationContext
模板方法的HTTP Client日志记录组件
一般来说,我们开发中通过抽象【接口、抽象类】来解决多态问题,都需要加一个中间层来管理/解耦抽象和具体使用者。
SOLID原则
单一职责原则(Single Responsibility Principle, SRP)
开放封闭原则(Open/Closed Principle, OCP)
里氏替换原则(Liskov Substitution Principle, LSP)
接口隔离原则(Interface Segregation Principle, ISP)
依赖倒置原则(Dependency Inversion Principle, DIP)
魔法语句
java设计模式中的XX是什么,能够解决哪类问题,他们都有什么特点。有哪些最佳实践。请分别举例5个项目场景和5个开源项目场景的应用。假设这是一次面试,请按照要求依次解答。