一、GOF 23种设计模式简介
设计模式其实是一门艺术。设计模式来源于生活,不要为了套用设计模式而去使用设计模式。设计模式是在我们迷茫时提供的一种解决问题的方案,或者说用好设计模式可以防范于未然。自古以来,在我们人生迷茫时,我们往往都会寻求帮助,或上门咨询,或查经问典。就在几千年前,孔夫子就教给了我们怎样做人。对于中国人来说都知道:从出生元婴、二十加冕、三十而立、四十不惑、五十知天命、六十花甲、七十古稀不逾矩、八、九十耄耋......我们这就是在用模板模式,当然,有些人不会选择这套模板。设计模式总结的是经验之谈,总结的是前人的经验,提供给后人去借鉴使用,前人栽树,后人乘凉。设计模式可以帮助我们提升代码的可读性、可扩展性;降低维护成本;解决复杂的业务问题。但是千万千万不要死记硬背,生搬硬套。
下图是GOF 23种设计模式的归纳和总结:
二、设计模式之间的关联关系和对比
1、单例模式和工厂模式
实际业务代码中,通常会把工厂类设计为单例。
2、策略模式和工厂模式
① 工厂模式包含工厂方法模式和抽象工厂模式,是创建型模式。策略模式属于行为型模式。
② 工厂模式主要目的是封装好创建逻辑。策略模式接收工厂创建好的对象,从而实现不同的行为。
3、策略模式和委派模式
① 策略模式是委派模式内部的一种实现形式,策略模式关注的结果是否能相互替代。
② 委派模式更关注分发和调度的过程。
4、模板方法模式和工厂方法模式
工厂方法是模板方法的一种特殊实现。
对于工厂方法模式的create()方法而言,相当于只有一个步骤的模板方法模式,这一个步骤交给子类去实现。而模板方法呢,将needHomework()方法和checkHomework()方法交给子类实现,这两个方法又属于父类的某一个步骤且不可变更。
5、模板方法模式和策略模式
① 模板方法和策略模式都有封装算法。
② 策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用。
③ 模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。
④ 模板方法模式不能改变算法流程, 策略模式可以改变算法流程且可替换。策略模式通常用来代替if...else...等条件分支语句。
a.WechatPay、JDPay、AliPay是交给用户选择且相互替代解决方案。而JdbcTemplate下面的子类是不能相互代替的。
b.策略模式中的queryBalance()方法虽然在pay()方法中也有调用,但是这个逻辑只是出于程序健壮性考虑。用户完全可以自主调用queryBalance()方法。而模板方法模式中的mapRow()方法一定要在获得ResultSet()之后才能调用,否则没有意义。
6、装饰者模式和静态代理模式
① 装饰者模式关注点在于给对象动态添加方法,而代理更加注重控制对对象的访问。
② 代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造函数。
装饰者和代理者虽然都持有对方引用,但逻辑处理重心是不一样的。
7、装饰者模式和适配器模式
① 装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)。
② 装饰者模式可以实现被装饰者相同的接口或者继承被装饰者作为它的子类,而适配器和被适配者可以实现不同的接口。
装饰者和适配器都是对SignInService的包装和扩展,属于装饰器模式的实现形式。但是装饰者需要满足OOP的is-a关系,不管如何包装都有共同的父类。而适配器主要解决兼容问题,不一定要统一父类,上图中的LoginAdapter和RegistAdapter就是兼容不同功能的两个类,但RegistForQQAdapter需要注册后自动登录,因此既继承了RegistAdapter又继承了LoginAdapter。
8、适配器模式和静态代理模式
适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。
9、适配器模式和策略模式
在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。
三、Spring中常用的设计模式对比
各设计模式对比编程思想总结
四、Spring中的编程思想总结
五、AOP在Spring中的应用
SpringAOP是一种编程范式,主要目的是将非功能性需求从功能性需求中分离出来,达到解耦的目的。主要应用场景有:Authentication(权限认证)、Auto Caching(自动缓存处理)、Error Handling(统一错误处理)、Debugging(调试信息输出)、Logging(日志记录)、Transactions(事务处理)。
六、学习AOP之前必须明白的几个概念
1、Aspect(切面):通常是一个类,里面可以定义切入点和通知。
2、JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用。
3、Advice(通知):AOP在特定的切入点上执行的增强处理,有before、after、afterReturning、afterThrowing、around。
4、Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式AOP框架创建的对象,实际就是使用代理对目标对象功能增强。Spring中的AOP代理可以使用JDK动态代理,也可以是Cglib代理,前者基于接口,后者基于子类。
七、关于Execution表达式
modifiers-pattern:方法的操作权限
ret-type-pattern:返回值(必填)
declaring-type-pattern:方法所在的包
name-pattern:方法名(必填)
parm-pattern:参数名
throws-pattern:异常
目前SpringAOP的配置形式有两种,XML和注解。
① XML的配置形式:
② Annotation注解形式:
希望通过对设计模式的系统学习、修炼好内功,在以后的源码生涯中不再晕车。