RedCloud Help

GOF23种设计模式

内容

  • 设计模式在于理解,不在于形式。

  • 不要为了套用设计模式而使用设计模式,而是,在业务上遇见问题时,很自然地想到设计模式作为一种解决方案。

总结

分类

设计模式

创建型

工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、创建者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)

结构型

适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰器模式(Decorator)、门面模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)

行为型

解释器模式(Interpreter)、模板方法模式(Template Method)、责任链模式(Chain of Responsibility)、命令模式(Commond)、迭代器模式(Iterator)、调解者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、访问者模式(Visitor)

创建组合

给对象增加职责

共享策略

共享状态

共享终结符

增加操作

定义语法

枚举子女

保存迭代状态

定义遍历

定义链

使用组合命令

避免滞后

改变外表改变内容

定义算法步骤

经常使用

动态地配置工厂

使用工厂方法实现

单个实例

单个实例

建造者模式

组合模式

装饰器模式

策略模式

模板方法模式

工厂方法模式

抽象工厂模式

单例模式

原型模式

门面模式

状态模式

解释器模式

访问者模式

迭代器模式

备忘录模式

命令模式

责任链模式

享元模式

代理模式

适配器模式

桥接模式

设计模式之间的关联和对比

单例模式和工厂模式

实际业务代码中,通常会将工厂类设计为单例。

策略模式和工厂模式

  1. 工厂模式包含工厂方法模式和抽象工厂模式是创建型模式,策略模式是属于行为型模式。

  2. 工厂模式主要目的是封装好创建逻辑,策略模式接受工厂创建好的对象,从而实现不同的行为。

策略模式和委派模式

  1. 策略模式是委派模式内部的一种实现形式,策略模式接受工厂创建好的对象,从而实现不同的行为。

模板方法模式和工厂模式

工厂方法是模板方法的一种特殊实现。

«interface»
ICourseFactory
create() : ICourse
PythonCourseFactory
create() : ICourse
JavaCourseFactory
create() : ICourse
«abstract»
NetworkCourse
createCourse() : void
checkHomework() : void
needHomework() : boolean
postSource() : void
postNote() : void
liveVideo() : void
createPPT() : void
postPreResouce() : void
BigDataCourse
checkHomework() : void
needHomework() : boolean
JavaCourse
checkHomework() : void

对于工厂方法模式的create() 方法而言,相当于知识一个步骤的模板方法模式。这一个步骤交给子类去实现。而模板方法呢,将needHomework()方法和checkHomework()方法交给子类实现,needHomework()方法和checkHomework()方法有属于父类的某一个步骤且不可变更。

#### 模板方法模式和策略模式

  1. 模板方法和策略模式都有封装算法。

  2. 策略模式是使不同算法可以互相替换,且不影响客户端应用层的使用。

  3. 模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。

  4. 模板方法模式不能改变算法流程,策略模式可以改变算法流程且不可替换。策略模式通常使用if..else..等条件分支语句。

«abstract»
Payment
getName() : String
queryBalance(string) : double
pay(string,double) : Result
WechatPay
getName() : String
queryBalance(string) : double
JDPay
getName() : string
queryBalance(string) : double
AliPay
getName() : string
queryBalance(string) : double
create
JdbcTemplate
executeQuery(string,RowMapper,Object[]) : List
closeConnection(Connection) : void
closeStatement(preparedStatement) : void
closeResultSet(ResultSet) : void
paresResultSet(ResultSet,RowMapper) : List
executeQuery(PreparedStatement,Object[]) : ResultSet
createPrepareStatement(connection,string) : preparedStatement
getConnection() : Connection
«interface»
RowMapper
mapRow(ResultSet,int) : T
MemberDao
selectAll() : List
  1. WechatPay、JDPay、AliPay是交给用户选择且相互替代解决方案。而JdbcTemplate下面的子类是不能相互替代的。

  2. 策略模式中的queryBalance()方法虽然在pay()方法中也有调用,但是这个逻辑知识处于程序健壮性考虑。用户完全可以自主调用queryBalance()方法。而模板方法模式中的mapRow()方法一定要在获得ResultSet之后方可调用,否则没有意义。

#### 装饰着模式和静态代理模式

  1. 装饰着模式关注点在于给对象动态添加方法,而代理更加注重控制对象的访问。

  2. 代理模式通常会在代理类中创建被代理对象的实例,而装饰着模式通常把被装饰者作为构建参数。

«interface»
Person
findLove() : void
Father
findLove() : void
findJob() : void
Battercake
getMsg() : string
getPrice() : int
BattercakeDecorator
BattercakeDecorator(Battercake)
doSomething() : void
getMsg() : string
getPrice() : int
BaseBattercake
getMsg() : string
getPrice() : int
EggDecorator
Eggdecorator(Battercake)
doSomething() : void
getMsg() : string
getPrice() : int

装饰者和代理者虽然都持有对象引用,但是逻辑处理重心是不一样的。

#### 装饰者模式和适配器模式

  1. 装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)

  2. 装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配者可以实现不同的接口。

«interface»
LoginAdapter
support(object) : boolean
login(string,object) : ResultMsg
LoginForQQAdapter
support(object) : boolean
login(string,object) : ResultMsg
RegisterForQQAdapter
support(object) : boolean
login(string,object) : ResultMsg
«interaface»
RegisterAdapter
support(object) : boolean
login(string,Object) : ResultMsg
«interface»
ISignService
register(string,string) : ResultMsg
login(string,string) : ResultMsg
SignForThirdService
siginForThirdService(ISigninService)
register(string,string) : ResultMsg
login(string,string) : ResultMsg
loginForQQ(string) : ResultMsg
loginForWechat(string) : ResultMsg
loginForToken(string) : ResultMsg
loginForTelphone(string,string) : ResultMsg
loginForRegister(string,string) : ReusltMsg
SignService
register(string,string) : ResultMsg
login(string,string) : ResultMsg

装饰者和适配器都是对SignService的包装和扩展,属于装饰器模式的实现形式。但是装饰者需要满足OOP的is-a关系,不管如何包装都有共同的父类。而适配器主要解决兼容性问题,不一定要统一弗雷,上图LoginAdapter和RegisterAdapter就是兼容不同功能的两个类,但RegisterForQQAdapter需要注册后自动登录,因此即需要继承RegisterAdapter又继承了LoginAdapter。

#### 适配器模式和静态代理模式 适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。

适配器模式和策略模式

在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。

Spring中常见的设计模式对比

设计模式

一句话归纳

举例

工厂模式(Factory)

只对结果负责,封装创建过程

BeanFactory、Calender

单例模式(Singleton)

保证独一无二

ApplicationContext、Calender

原型模式(Prototype)

拔一根猴毛吹出千万个

ArrayList、PrototypeBean

代理模式(Proxy)

找人办事,增强职责

ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy

委派模式(Delegate)

干活算你的(普通员工),功劳算我的(项目经理)。

DispatcherServlet、BeanDefinitionParserDelegate

策略模式(Strategy)

用户选择,结果统一

InstantiationStrategy

模板模式(Template)

流程标准化,自己实现定制。

JdbcTemplate、HttpServlet

适配器模式(Adapter)

兼容转换头。

AdvisorAdapter、HandlerAdapter

装饰器模式(Decorator)

包装,同宗同源

BufferReader、InputStream、OutputStream、HttpHeadResponseDecorator

观察者模式(Observer)

任务完成时通知

ContextLoaderListener

Spring中的编程思想总结

Spring思想

应用场景(特点)

一句话归纳

OOP

Object Oriented Programming(面向对象编程)用程序归纳总结生活中一切事物

封装、继承、多态

BOP

Bean Oriented Programming(面向Bean编程)面向Bean(普通的java类)设计程序,解放程序员

一切从Bean开始

AOP

Aspect Oriented Programming(面向切面编程)找出多个类中一定规律的代码,开发时拆开,运行时再合并。面向切面编程,及面向规则编程

解耦,专人做专事

IOC

Inversion of Controller(控制反转)将new对象的动作交给Spring管理,并由Spring保存已创建的对象(IOC容器)

转交控制权(即控制权反转)

DI/DL

Dependency injection(依赖注入)或者Dependency Lookup(依赖查找)依赖注入、依赖查找,Spring不仅保存自己创建的对象,而且保存对象与对象之间的关系.注入即赋值,主要三种方式构造方法、set方法、直接赋值

赋值

AOP在Spring中的应用

SpringAOP是一种变成范式,主要目的是将非功能性需求从功能性需求中分离出来,达到解耦的目的。主要应用场景有:Authentication(权限认证)、Auto Caching(自动缓存处理)、Error Handling(统一错误处理)、Debugging(调试信息输出)、Logging(日志记录)、Transactions(事物处理)。

13 February 2026