《设计模式解析》笔记

2019-02-16  本文已影响0人  FreDdy_GY

最近阅读学习了《设计模式解析》一书,这本书主要解释了设计模式带来了什么好处、解决了什么问题,以及如何更好的使用它们。感觉其中有很多要点都非常的有道理,值得记录下来,在开发的时候时不时拿出来翻看,温故知新,做一个优雅的开发者。

继承可能会带来的问题

  1. 弱内聚:五边形、六边形等都作为shape的子类,那么边线绘制的逻辑会存在于每一个类中

  2. 减少了复用的可能性:难道每次想要复用五边形的绘制代码,都要继承它?

设计两步法

  1. 抽象类(共性) 需要用什么接口来处理这个类的所有责任
  2. 派生类(可变性) 对于这个给定的特定实现,应该怎么样根据给定的规约来实现它?
  • 规约视角和概念视角的关系在于:规约标识了用来处理此概念所有情况所需的接口
  • 规约视角和实现视角的关系在于:对于给定的规约,怎样实现这个特定情况

可测试的代码是优秀代码的主要品质

敏捷编程中非常独具特色的实践之一,就是在编写代码之前就编写测试,这有几个目的:

  1. 最后能得到一组自动化测试。
  2. 必须按方法的接口而非实现来设计,这样能得到封装更好,耦合更松散的方法。
  3. 关注测试会使你注意将概念分成多个可测试的部分,这样能够获得强内聚和松耦合。

对象应该只对自己负责

设计者设计出的接口,没有必要考虑抽象类所有可能的派生类,这可能导致另一种分析瘫痪,只需要支持那些实际要构造的派生类即可。

一条规则(设计模式),实现一次

模式应该按顺序每次只运用一个,首先应用那些要为其他模式创造背景的模式

开发步骤
  • 找出模式:
    找到问题中存在的模式,用这些模式来思考问题。请记住,模式的用途是定义实体之间的关系
  • 从背景模式开始:
    找出为其他模式创造了背景的模式。这些模式应该作为设计的起点。然后从背景转向内部,观察其余的模式和任何其他可能已经发现的模式,从中选出为其余模式定义背景的模式,重复这一过程
  • 改进设计:
    改进过程中始终考虑模式所蕴含的背景
  • 实现:
    实现应该融入模式所要求的细节

这是建筑学中的理论,在软件设计中一个模式可能无法成为另一个模式的背景,但我们能做到在已经出现的概念的背景中添加新概念进行设计。

抽象类与接口

  • 抽象类允许有公共的状态或者行为
  • 在不需要的时候不要使用抽象类,因为只有从一个类派生的机会
  • 抽象类可以看成是一种聚集相关实体的方式,其关注点是如何设计这些具体的实体,从而可以以同样的方式使用它们。
  • 通过考虑服务对象,看如何抽象它们,使用对象才不会与任何特定于实现的细节相耦合。
  • 接口看上去更符合依赖倒置原则,看上去更简单,但并不代表其优于抽象类。
  • 当需要定义公开的状态、行为时,也可能定义一个接口,然后用抽象类实现该接口
  • 抽象类能够确定默认行为,使实现类更加简单

Decorator(装饰者)模式

动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator比生成子类更灵活。

Decorator模式的约束因素
  • 考虑存在几种可选的功能
  • 这些装饰对象可能遵循也可能不遵循所有规则
  • 需要某种方式以所需的不同顺序调用这些装饰对象,但是又不能加重客户对象的负担
  • 不希望应用程序必须承担知道使用哪些装饰对象的职责

Template Method模式

定义一个操作中算法的骨架,而将一些步骤延迟到子类中,不改变算法的结构而重定义它的步骤。

各种工厂模式

开发分为以下两步方法:

  • 定义对象和它们的协作方式
  • 编写为相应情况实例化对象并在对象共享时管理已有对象的工厂
  • 对象要么构造其他对象,要么使用其他对象,绝不要两者兼顾

  • 工厂封装了在什么环境下创建什么对象的规则,这样当系统的其他部分使用对象时,就可以不考虑具体的实现。

工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。

总结

在模式的学习过程中,寻找以下约束因素和概念会有所帮助
  • 这个模式隐藏了什么实现?这样我们就可以修改它
  • 这个模式中有什么共性?这有助于你找到共性
  • 这个模式中对象的责任是什么?这可以更容易地按责任进行分解
  • 这些对象之间有什么关系?这将提供这些对象的约束因素的信息
  • 这个模式本身怎样成为从背景设计的微观示例?这使我们能够更好地理解为什么这个模式是优秀设计
上一篇下一篇

猜你喜欢

热点阅读