第二章 面向对象设计原则
软件的可维护性和可复用性
- 软件的复用(Reuse)或重用拥有众多优点,恰当的复用还可以改善系统的可维护性。
- 复用的目标在于实现支持可维护性的复用
- 可维护性复用都是以面向对象设计原则为基础的
重构(Refactoring)是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
面向对象设计原则
-
单一职责原则(Single Responsibility Principle, SRP)
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
单一职责原则是实现高内聚、低耦合的指导方针
-
开闭原则(Open-Closed Principle, OCP)
一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
抽象化是开闭原则的关键。
-
里氏代换原则(Liskov Substitution Principle, LSP)
所有引用基类(父类)的地方必须能透明地使用其子类的对象。也就是说在软件中如果能够使用基类对象,那么一定能够使用其子类对象。把基类都替换成它的子类,程序将不会产生任何错误和异常。
-
依赖倒转原则(Dependence Inversion Principle, DIP)
高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。即要针对接口编程,不要针对实现编程。
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段
依赖倒转原则的常用实现方式之一是在代码中使用抽象类,而将具体类放在配置文件中
依赖倒转原则要求客户端依赖于抽象耦合,以抽象方式耦合是依赖倒转原则的关键
-
接口隔离原则(Interface Segregation Principle, ISP)
客户端不应该依赖那些它不需要的接口。接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干
-
合成复用原则(Composite Reuse Principle, CRP)又称为组合/聚合复用原则(Composition/ Aggregate Reuse Principle, CARP)
尽量使用对象组合,而不是继承来达到复用的目的
组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用
-
迪米特法则(Law of Demeter, LoD)又称为最少知识原则(Least Knowledge Principle, LKP)
不要和“陌生人”说话;只与你的直接朋友通信;每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
简单地说,迪米特法则就是指一个软件实体应当尽可能少的与其他实体发生相互作用。
迪米特法则的主要用途在于控制信息的过载。在类的划分上,应当尽量创建松耦合的类;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低
第三章 设计模式概述
模式是在特定环境中解决问题的一种方案
软件模式是软件开发的总体指导思路或参照样板,是对软件开发这一特定“问题”的“解法”的某种统一表示
软件模式的基础结构由4个部分构成:问题描述、前提条件(环境或约束条件)、解法和效果。
设计模式
是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式(加粗的为关键元素)
根据其目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种
创建型模式主要用于创建对象;结构型模式主要用于处理类或对象的组合;行为型模式主要用于描述对类或对象怎样交互和怎样分配职责
根据范围,即模式主要是用于处理类之间关系还是处理对象之间的关系,可分为类模式和对象模式两种
设计模式的优点
- 融合了众多专家的经验,以一种标准的形式供开发人员所用,提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交流,设计模式可以降低开发人员理解系统的复杂度
- 使人们可以更加简单方便地复用成功的设计和体系结构
- 使得设计方案更加灵活,且易于修改
- 可以提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本
- 有助于初学者更深入地理解面向对象思想
第四章 简单工厂模式
简单工厂模式是创建型模式
创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对