• 章节目录
  • 面向对象导论
    • 面向对象基础
    • 面向对象设计原则
  • 策略模式
  • 观察者模式
    • 自己实现观察者模式
    • 使用 util 实现观察者模式 - Java
    • 使用 util 实现观察者模式 - Scala
    • 观察者模式的设计原则
  • 装饰器模式
    • 装饰器模式用于装饰咖啡配料
    • 装饰器模式用于过滤InputStream
    • 面向修改关闭,面向扩展开放
    • 装饰器的适用和缺陷
    • 装饰器模式的一个小例子
    • 装饰器模式的一个对比
策略模式、观察者模式和装饰器模式 - 内容简介

本章首先介绍了面向对象的基础:抽象、封装、多态和继承,之后提到了四大设计原则:区分变化和不变的部分,针对接口而不是实现变成,多用组合而不是继承,类和类之间尽可能解耦。好的设计应该满足复用、可扩展、可维护三大特征。

在第二部分讲解了策略模式:策略模式指的是定义算法族,封装它,然后使其可互相替代,之后将可变的算法和算法使用者区别开。这种设计能够满足我们希望将代码从方法中分离出去到状态,然后区分可变和不可变的这一目的。策略模式属于“提供服务”的“组合+委托”的设计模式。

第三部分主要讲解了观察者模式,观察者模式定义了对象的一对多关系,当一个对象的状态改变,会自动通知并且更新其余对象的状态(通过接口调用更新方法),这样实现了轻度的耦合,同时满足了我们希望将可变的状态跨类别集中管理的目的。观察者模式可以看作“反组合”的模式,其并不通过内置一个实例对象来提供不同服务,而是通过将状态交给外部的类来进行管理。观察者模式属于“统一接口”的设计类别,任何类都可以实现观察者接口,然后将其状态更新实现在 update 方法中,交给观察对象,使用容器进行保存。观察对象自动对注册的观察者进行状态改变。

在第四部分主要讲解了装饰器模式,这种模式指的是动态的将责任添加到对象上。在实现层面,其通过内部实例在构造时传入和保存对象,然后通过继承以达成和这个对象共享同一套API和类名称的目的,之后操纵此对象完成对API的服务,并且在此过程中添加装饰。装饰器模式主要适用于不定个变化需要动态添加的情况,这点和策略模式很像(策略模式强调相互替代的变化动态添加)。装饰器模式属于“统一接口”的设计类别,和其相似但是功能完全相反的是“代理模式”。

最后更新于 2019-02-09 查看笔记

装饰器抽象类的必要性

装饰器模式是仅次于策略模式的,最为常用的模式之一。最基本的装饰器继承被装饰的接口,然后重写接口提供方法。但重写接口很繁琐,在 J8 中,接口有了默认实现,还好。在 J8 之前,一般是通过创建一个装饰器抽象类,提供一些默认实现,这个抽象类继承被装饰的类/实现其接口,然后装饰器继承此装饰器抽象类,这样就可以专注于变和不变的区分,而将繁琐的样板代码收归一处,在装饰器抽象类中管理。

2018-11-10
多个配置文件和策略模式

当之前定义的配置类不满足需要,那么就去修改原来的配置类,而不要动服务类。我的一个工程中,为了使用两种不同的配置类,我对于服务类提供了两个策略模式的实现,这两个配置类提供的配置类似,这样很不好,违反了亲密朋友原则,耦合也增大了。

在后续的重构中,我让一个配置类提供使用或者不使用另外一个配置类的设计模式,让两个配置类耦合,而只有“最亲密“的那个配置类和服务类进行交互,这样更易于扩展。

2018-11-10
策略模式实践

通过为配置类使用策略模式,提供了对于服务类的更加灵活的调用方法。在我的 muninn 项目中,基于构造器配置类传递,完成了具体的文件来源和服务的解耦。

在函数式编程中,Stream、Lambda 表达式也是策略的很好的载体,比如提供用来加载文件的策略、导出数据的策略、处理集合的策略。策略模式很好的完成了变化与不变的分离。

2018-11-10
Scala 特质混入和装饰器模式

Scala 基于特质混入的继承是一种实现适配器最优雅的方案。线性的 super 调用和动态绑定赋予了 Scala 代码更加动态和灵活的调用能力。虽然 Java 8 允许接口实现方法,但是,那是富接口的用法,本质是方法重载,而不是装饰

2018-11-30
装饰器模式图解

http://static.mazhangjing.com/%E5%9B%BE%E5%83%8F.jpeg

2019-01-23