Observer 模式
关键特征:
意图:在对象之间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有的依赖者都将得到通知并自动更新。
问题:当某个事件发生时,需要向一系列变化着的对象发出通知。
解决方案:Observer 将监视某个事件的责任委托给中心对象 Subject。
参与者与协作者:Subject 知道自己的 Observer,因为 Observer 要向它注册。Subject 必须在所监视的事件发生时通知 Observer 。Observer 负责向 Subject 注册,以及在得到通知时从 Subject 处获取信息。
效果:如果某些 Observer 只对事件的一个子集感兴趣,那么 Subject 可能会告诉它们不需要通知的事件。如果 Subject 通知 Observer,Observer 还返回请求更多信息,则可能需要额外的通信。
实现:让某个事件发生时需要知道的对象(Observer)将自己注册到另一个监视事件发生或自己触发事件的对象(Subject)上。
事件发生时,Subject 告诉 Observer 事件已经发生。为了对所有 Observer 类型的对象实现 Observer 接口,有时候需要使用 Adapter 模式。
Template Method 模式
Template Method 是一个旨在帮助我们在抽象层次从一组不同的步骤中概括出一个通用过程的模式。
Template Method 模式其实就是控制不同过程中共同的序列。工作原理:为变化的步骤提供虚方法。
懂得模式有助于引导重构。
当有新需求需要处理时,应该采取以下两个步骤:
1、先重构代码,不添加任何功能,这样加入新功能时可以遵守开闭原则。
2、添加新的代码,只影响工厂类和新代码。
关键特征:
意图:定义一个操作中算法的骨架,将一些步骤推迟到子类中实现。可以不改变算法的结构而重定义该算法的步骤。
问题:要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同。
解决方案:允许定义可变的子步骤,同时保持基本过程一致。
参与者与协作者:Template Method 模式由一个抽象类组成,这个抽象类定义了需要覆盖的基本 TemplateMethod 方法。每个从这个抽象类派生的具体类将为此模式实现新方法。
效果:模版提供了一个很好的代码复用平台。它还有助于确保所需步骤的实现。它将每个 Concrete 类的覆盖步骤绑定起来,因此只有在这些变化总是并且只能一起发生时,才应该使用 Template Method 模式。
实现:创建一个抽象类,用抽象方法实现一个过程。这些抽象方法必须在子类中实现,以执行过程的每个步骤。如果这些步骤是独立变化的,那么每个步骤可以用 Strategy 模式来实现。