读书笔记:《设计模式解析》

1、共性和可变性分析:
    ①找到变化的地点,称为共性分析;然后找出如何变化,称为变性分析。
    ②可变性只有在给了共性之后才有意义,也就是说,在找到共性之后,有助于进行可变性分析。
    ③共性的概念可以用抽象类、接口表示,可变性分析所发现的变化可以通过具体类实现。

2、考虑变化的设计
    ①面向接口进行编程,而不是面向实现的。
    ②优先使用对象组合(聚合),而不是类继承,对象组合(聚合)能够适配调用的相应类及子类。
    ③对变化的概念进行封装,使发生变化时,不引起重复设计。
    ④考虑变化设计造成的短期开销是值得的,而且考虑到代码可读性、可测试性、可维护性等等因素,相对于直接编码,并不会造成额外的开销,还可能节省开销。

3、设计模式解决方案很好,但不总是完美
    ①通过使用设计模式,在未来发生变化时,设计模式能够很明确的给使用者处理解决问题的方法。
    ②设计模式能够让使用者进行更抽象和更通用的思考,而且变化时是否采用通用的解决方案来实现,设计模式并不强制要求。
    ③设计模式并不总能提供十全十美的解决方案,但是设计模式是众多设计人员多年的结晶,所以它们通常优于自己有限的时间所能提出的解决方案。

4、设计模式的正确使用
    在解决问题时,不要寻找哪里可以用哪种设计模式,而是分析问题、理解问题。寻找哪里可以使用设计模式只能告诉你要做什么,而不能知道什么时候该使用设计模式,为什么使用设计模式。应该将设计模式与问题域的特性和行为进行匹配,以考虑使用哪种设计模式。理解了设计模式的“其然”和“所以然”之后,选择适用的模式时更加高效。
    使用模式时,应该考虑模式所蕴含的问题和与模式相关的各种知识,将模式看作是一种指导,看做一种思考问题的辅助手段,一个由许多考虑事项组成的列表。
    模式实现的具体方式应该由问题的本质、约束条件和需求等等决定,而不是根据在某本书中碰巧看到的某个实现。
    设计模式能够为我们提供一种语言,使我们超越于细节之上,以实际的方式讨论背景。这样我们更能看到问题域中的约束因素。模式有助于我们吸收前人的经验教训,有助于创建健壮性、可维护而且有生气的系统。

5、部分到整体的设计的缺陷
    设计常被认为是一个合成的过程,常被认为先去思考部分,先从具体的事物开始设计,然后由部分进行组合,最终才有了整体,但这可能不是最好的思路,在设计决策中,经常会陷于细节之中,而忘记了系统更大的背景。
    从部分去构造整体,不可能的到优美的设计。因为如果部分是在整体之前产生的,则往往将注意力集中在部分,即使在将部分放到全局考虑里时,也仍然将注意力集中在部分。这样形成的部分往往是设计者根据自己经验设置的通用(常用)的部分,而不是符合当前整体背景的特性的部分,这样的部分很难满足当前背景的特殊需要,从而为以后的变化导致难以维护埋下伏笔。

6、开闭原则
    ①可以这样理解:模块、方法和类应该对扩展开放,对修改封闭,也就是说,应该将软件设计得不对其修改就能扩展功能。
    ②开闭原则本质上意味着将软件设计成为新功能可以作为单独的模块加入系统,从而尽量降低集成的成本。
    ③完全遵循开闭选择是几乎不可能的,但可以将它作为一个目标,遵循这一原则,以后适应新的需求就会越轻松。

7、依赖倒置原则
    该原则背后的理念是应该在设计细节之前先创建总体概念,也就是说先有概念,再逐渐细化。
    ①高层模块不应该依赖于低层模块,高层模块和低层模块都应该依赖抽象。
    ②抽象不应该依赖于细节,细节依赖于抽象。
    ③复杂化是指从最简单的层次开始,然后逐渐添加细节和特征,随着逐步深化,设计也渐趋复杂的过程。

8、理性怀疑原则,使用模式常见的错误
    ①浮于表面,仅仅对低层情况有了一些肤浅的理解,就草草选择了一个模式。
    ②偏见,对模式过于偏信,根据已选定的模式来解释所有数据,不愿对自己的偏见有任何质疑。
    ③错选,不理解模式适用的背景和条件(对各种模式的分类关系理解不全),选择了错误的模式。
    ④误判,不熟悉各种模式,因为无知而导致误判。
    ⑤削足适履,忽略了实际的、具体实例行为中的例外情况,因为它们似乎不符合模式中所表达的理论。很可能会使所建模出来的对象过于僵硬,不符合实际情况。        

9、Liskov替换原则(里氏替换原则)
子类可以扩展父类的功能,但不能改变父类原有的功能。
    ①子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
    ②子类中可以增加自己特有的方法。
    ③当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类的输入参数更宽松。
    ④当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

10、Abstract Factory的实现方式及背景因素判断
    P186

11、Adapter模式的背景
    P187

12、Facade模式的背景
    P187

13、CVA(共性和可变性分析)的方式
    ①先寻找共性,寻找概念,坚持每个共性只针对一个问题,否则设计中就不能有比较强的内聚。
    ②从这些共性创建抽象,表示概念。
    ③从共性的变化寻找派生,进行细化。
    ④看共性与其他共性之间的关系如何。
    ⑤扩展设计。

14、CVA与设计模式
        CVA与设计模式是相辅相成的。CVA强调尽早关注抽象,这样更可能找到最有用的抽象;设计模式关注于这些抽象之间的关系,帮助利用来自过去成功设计的真知灼见。

15、设计模式的分类建立在概念性动机上
    ①行为型模式用于封住行为的变化,产生灵活的行为。定义新对象时,我们按自己的需要定义他们,使用行为型模式作为指导。
    ②结构型模式用于将已有的代码集成到新的面向对象设计中。我们要将已有的对象加入新的设计中时,使用结构型模式作为指导最为合适。
    ③创建型模式用于管理对象的创建。如,使用工厂是隐藏变化的一种自然结果。

16、工厂解决的问题
    工厂所解决的问题正是模式带来的问题。模式的方式是在代码中增加中间层次,因为它要获得维护性更好的对象。但是,这也加重了代码中客户代码的负担,迫使它知道所有这些对象,从而使代码更加复杂。工厂隐藏了这些额外对象的事实,这简化了代码,提高内聚性,松散耦合,并有助于测试。创建/管理对象和使用对象两种关系永远不要同时存在,保持分离,减少了维护工作量。

17、创建和使用对象的三个主要任务
    ①根据所履行的责任找出对象。这时共性和可变性分析极为有用。
    ②决定如何使用这些对象。主要考虑对象间的关系,这正是许多模式所要解决的问题。
    ③决定如何创建管理这些对象。这正是工厂的用武之地。

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

19、设计模式回顾:总结与新起点
p283 ,值得反复看 

猜你喜欢

转载自blog.csdn.net/key_next/article/details/78644495
今日推荐