1.什么是设计模式:可重复使用的解决方案,每种模式描述了某一类问题的通用解决方案。
设计模式的核心作用就是解耦。创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为模式是将不同行为代码解耦。
借助设计模式,将大坨代码拆分成职责更单一的小类,让其满足开闭原则,高内聚低耦合特性,以此来控制和应对代码的复杂性,提高可扩展性。
2. 设计模式的四个部分:
1) 模式名称
2) 待解问题:何时需要运用该模式
3) 解决问题:抽象的解决方案描述,组成元素(类和对象),他们间的关系,职责和合作
4) 结论:方案的利弊,以及其对系统的可扩展性,可移植性的影响
3.分类
1) 功能分
创建模式(creational patterns):对类的实例化过程的抽象;
结构模式(structural patterns):将类或者对象结合到一起形成更大的结构;
行为模式(behavioural patterns):在不同对象间划分责任和算法的抽象化
2)方式分
类模式:以继承的方式实现模式,静态的
对象模式:以组合的方式实现模式,动态的
4. 创建型 - 主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码
4.1 : 单例模式Singleton
1) 为何使用:处理资源访问冲突;表示全局唯一,例如,配置信息类
2)实现需要关注的点:线程安全;延迟加载;性能(是否加锁)
4.2 : 工厂模式Factory
工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象工厂模式:提供了一个接口,用于创建相关或依赖的对象的家族,而不需要明确指定具体类
5.结构型主要总结了一些类或者对象组合在一起的经典结构,这些经典结构解决特定应用场景的问题。
5.1 :代理模式 Proxy
在不改变原始类(代理类)的情况下,通过引用代理类来给原始类附加功能。通过代理类继承原是类的方法来实现。
应用场景:1) 业务系统的非功能性开发,比如统计,监控,鉴权,限流,事务,幂等,日志;RPC,缓存中的应用;
5.2 :装饰器模式Decorator
主要解决继承过于复杂的问题,通过组合来替代继承。主要的作用是给原始类添加增强功能,这也是判断是否该用装饰器模式的一个重要依据。同时,可以对原始类嵌套使用多个装饰器。
装饰器是对功能的增强。同样是组合关系的代码结构,代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。
5.3 :适配器模式Adapter
做适配器,将不兼容的接口一起工作,就像一个USB转换头。
一般来说,适配器模式可以看作一种补偿模式,用以补救设计上的缺陷,应用场景是接口不兼容。提供跟原始类不同的接口,代理模式和装饰器模式提供的都是跟原始类相同的接口。
主要用于:封装有缺陷的接口设计;统一多个类的接口设计;替换依赖的外部系统;兼容老版本接口;适配不同格式的数据;
6.行为型
主要解决类或者对象之间的交互问题
6.1 观察者模式Observer - 发布订阅模式 Publish-Subscribe
1)在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都自动收到通知。其将观察者和被观察者解耦。
2)应用场景:邮件订阅;RSS
6.2 模板模式TemplateMethod
1)在一个方法中定义一个算法框架,并将某些步骤推迟到子类中去实现。模板方法可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里的算法可以理解为广义的业务逻辑。
2)主要解决复用和框架的扩展两个问题。基于继承关系实现,子类重写父类的抽象方法,是一种类之间的关系。
复用:模板方法可以将算法中不变的流程抽象到父类中,将可变的部分留给子类来实现。所有的子类都可以复用父类中模板方法定义的流程代码。
框架的扩展:模板常用在框架的开发中,让框架用户可以在不修改源码的情况下定制框架的功能。
6.3 策略模式Strategy
定义一族算法类,将每个算法分别封装起来,让他们可以互相替换。策略模式可以使算法的变化独立于使用他们的代码。
策略模式解耦的是策略的定义,创建,使用三个部分。
1)策略的定义
策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,其基于接口而非实现编程,可以灵活的替换不同的策略。
2)策略的创建
创建由工厂类完成,封装策略创建的细节
3)策略的使用
一般包含一组可选策略,客户端通过两种方式选择使用哪种策略:编译时静态确定;运行时动态确定。掐红运行时动态确定为典型应用场景。