设计模式是一种思想,灵活运用思想远大于死记代码、咬文爵字
创建型模式**(Creational Patterns)**
单例(Singleton)模式
原型(Prototype)模式
工厂方法(FactoryMethod)模式
抽象工厂(AbstractFactory)模式
建造者(Builder)模式
结构型模式(Structural Patterns)
代理(Proxy)模式
适配器(Adapter)模式
桥接(Bridge)模式
装饰(Decorator)模式
外观(Facade)模式
享元(Flyweight)模式
组合(Composite)模式
过滤器模式(Filter Pattern)
行为型模式(Behavioral Patterns)
模板方法(Template Method)模式
策略(Strategy)模式
命令(Command)模式
职责链(Chain of Responsibility)模式
状态(State)模式
观察者(Observer)模式
中介者(Mediator)模式
迭代器(Iterator)模式
访问者(Visitor)模式
备忘录(Memento)模式
解释器(Interpreter)模式
单例模式:一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。
单例特点:
某个类只能有一个实例;(构造器私有)
它必须自行创建这个实例;(自己编写实例化逻辑)
它必须自行向整个系统提供这个实例;(对外提供实例化方法)
(使用场景:多线程中的线程池,数据库的连接池,系统环境信息,上下文(ServletContext))
原型模式:原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。
本体给外部提供一个克隆体进行使用。
(使用场景:资源优化,性能和安全要求,一个对象多个修改者的场景。
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时可以考虑使用原型模式拷贝多个对象供调用者使用。深(两个完全对象不一样的【递归克隆】,内容却完全一样)、浅(只是属性赋值)。
工厂模式:工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。
使用场景:(NumberFormat、SimpleDateFormat,BeanFactory:Spring的BeanFactory(就是为了造出bean))。
建造者模式:创建的东西细节复杂,还必须暴露给使用者。屏蔽过程而不屏蔽细节。
使用场景:StringBuilder:append(); 给谁append呢?
适配器模式:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
关于我自己的理解就是适配器模式是一个类调用另一个类来加强自己。
使用场景:(Tomcat如何将Request流转为标准Request,Spring AOP中的AdvisorAdapter是什么,Spring MVC中经典的HandlerAdapter是什么)
桥接模式:将抽象与实现解耦,使两者都可以独立变化
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。不同颜色和字体的文字、不同品牌和功率的汽车
桥接将继承转为关联,降低类之间的耦合度,减少代码量
我自己的理解就是把那些容易变化的部分抽离出来。
使用场景:当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
组合模式:把一组相似的对象当作一个单一的对象。如:树形菜单
使用场景:层次结构,部门组织结构。
引发的问题:组合了别的对象还是组合模式吗?
狭义和广义的理解:狭义的理解既然是相似的对象那就不同的对象组合在一起那就肯定不是组合模式。从广义的角度来讲,Java的所有对象的祖宗类都是Object,那么又可以说是用到了组合模式。
装饰器模式:向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
使用场景:
SpringSession中如何进行session与redis关? HttpRequestWrapper
MyBatisPlus提取了QueryWrapper,这是什么?
Spring中的BeanWrapper是做什么?
Spring Webflux中的 WebHandlerDecorator?
外观模式:外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
使用场景:
- 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。以此类比…
- JAVA 的三层开发模式。
- 分布式系统的网关
- Tomcat源码中的RequestFacade干什么的?
代理模式:分为静态代理和动态代理
,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,对象结构型模式。这种也是静态代理。
静态代理可以说就是装饰模式,装饰模式是一种特殊的静态代理。
JDK动态代理必须实现接口,有时候没必要实现接口,以此引发cglib动态代理。
使用场景:
- MyBatis的mapper到底是什么?怎么生成的?
- Seata的DataSourceProxy是什么?
- DruidDataSource存在的Proxy模式
享元模式:享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。
使用场景:数据库连接池,所有的池化技术。
过滤器模式:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。结合多个标准来获得单一标准。
模板模式:在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
使用场景:Spring的整个继承体系都基本用到模板方法。
JdbcTemplate、RedisTemplate都允许我们再扩展…
我们自己的系统也应该使用模板方法组织类结构
策略模式:策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。属于对象行为模式。
使用场景:使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。
线程池拒绝策略。
状态(State)模式:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
使用场景:流程框架与状态机。
中介者模式:中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,减少对象间混乱的依赖关系,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象行为型模式。
使用场景:SpringMVC 的 DispatcherServlet是一个中介者,他会提取Controller、Model、View来进行调用。而无需controller直接调用view之类的渲染方法。
分布式系统中的网关。
观察者模式:观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
使用场景:Spring事件机制如何实现?Vue的双向绑定核心。
响应式编程核心思想。
备忘录模式:备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。对象行为型模式
使用场景:游戏存档,数据库保存点事务(savepoint)。
解释器模式:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。类行为型模式
使用场景:编译原理。
命令模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
迭代器模式:提供一个对象(迭代器)来顺序访问聚合对象(迭代数据)中的一系列数据,而不暴露聚合对象的内部表示。对象行为型模式。
使用场景:jdk容器接口的Iterator定义
现实开发中,我们几乎无需编写迭代器,基本数据结构链表、树、图的迭代器已经都有了。除非要重写迭代逻辑。
访问者模式:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。
责任链模式:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。属于对象行为型模式。