引言
设计模式就是把
优化为
这就是设计模式的作用
- 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强
- 可以提高程序员的思维能力、编程能力和设计能力
- 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期
- 小知识
- 设计模式是源于建筑业
- “四人组(Gang of Four,GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”于1994年归纳发表了23种在软件开发中使用频率较高的设计模式
定义与分类
定义
- 定义:设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用。
- 基本要素:设计模式一般包含模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式等基本要素,4个关键要素如下:==模式名称 (Pattern Name) ;问题 (Problem) ;解决方案 (Solution) ;效果 (Consequences) ==
分类
-
目的分类:创建型(Creational),结构型(Structural)和行为型(Behavioral)三类
- 创建型模式主要用于创建对象
- 结构型模式主要用于处理类或对象的组合
- 行为型模式主要用于描述类或对象如何交互和怎样分配职责
-
范围分类:类模式 和 对象模式
- 类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是一种静态关系
- 对象模式处理对象间的关系,这些关系在运行时变化,更具动态性
UML中的类图
类和接口和类图
- 类(class)
- 类名(Name),如:Student
- 属性(Attribute)是指类的特性,
- 格式:
[可见性]
属性名:类型[=缺省值]
(“可见性”在类图中分别用符号+、-、#、~
表示) - 操作(Operations)是类的成员方法,格式:
[可见性]
名称(参数列表)[: 返回类型]
UML中,可见性分为4级
-
public 公用的 :用
+
前缀表示 ,该属性对所有类可见 -
protected 受保护的:用
#
前缀表示,对该类的子孙可见 -
private 私有的:用
-
前缀表示,只对该类本身可见 -
package包的:用
~
前缀表示,只对同一包声明的其他类可见
-
接口(Interface):描述了类或组件对外可见的动作
-
类图(ClassDiagram):显示系统中的类、接口、协作以及它们之间的静态结构和关系的一种静态模型。
“计算长方形和圆形的周长与面积”的类图
类之间的关系
-
依赖(Dependency)关系:一种使用关系,它是对象之间耦合度最弱的一种关联方式
-
关联(Association)关系:对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系
- 关联关系分为一般关联关系、聚合关系和组合关系
- 关联可以是双向的,也可以是单向的
上图为双向关联
-
聚合(Aggregation)关系:强关联关系,是整体和部分之间的关系,是has-a的关系
-
组合(Composition)关系:表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系,是contains-a关系
-
泛化(Generalization)关系:对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系, 是is-a的关系
-
实现(Realization)关系:接口与实现类之间的关系
面对对象设计原则
-
开闭原则定义(OCP):软件实体应当对扩展开放,对修改关闭
-
里氏替换原则(LSP):所有引用基类的地方必须能透明地使用其子类的对象
-
依赖倒转(置)原则(DIP):高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象
-
单一职责原则(SRP):一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中
-
接口隔离原则(ISP):客户端不应该依赖那些它不需要的接口
-
迪米特法则又称为最少知识原则(LoD):每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位(简单说就是不与陌生人说话)
-
合成复用原则又称为组合/聚合复用原则(CRP):优先使用对象组合,而不是继承来达到复用的目的
注意:复用时要尽量使用组合/聚合关系(关联关系),少用继承