1. 什么是设计模式
设计模式(Design Pattern)是指在软件开发中,经过验证的,用于解决特定环境下、重复出现的、特定问题的解决方案
2. 设计模式的目的
- 提高代码的可读性(规范)
- 提高代码的重用性(相同功能的代码,不用重复编码)
- 提高代码的可扩展性(需要新增新的功能时,非常方便)
- 提高代码的可靠性(增减功能时,对原有功能没有影响)
- 使程序呈现高内聚,低耦合的特性
2. 设计模式的组成
- 模式名称
- 问题场景
- 解决方案
- 最终效果
3. 设计模式的七大原则
(1)一职责原则(Single Responsiblity Principle SRP)
- 定义:一个类,一个方法只去完成一件事情;此原则的核心就是解耦和增强内聚性
- 注意事项和细节
- 降低类的复杂度,一个类只负责一项职责
- 提高类的可读性,可维护性
- 降低业务需求变更带来的风险
- 在开发的过程中,要遵守单一职责原则;
(2)接口隔离原则(Interface Segregation Principle,ISP)
- 定义:客户端不应该使用不需要的接口,接口的设计尽量独立
(3)依赖倒转(倒置)原则(Dependency Inversion Principle,DIP)
- 定义:程序要依赖于抽象接口,不要依赖于具体实现;即要求对抽象进行编程,不要对实现进行编程,以降低耦合
- 高层模块不应该依赖底层模块,两者应该依赖其抽象
- 抽象不应该依赖细节,细节应该依赖其抽象
- 依赖倒转(倒置)的中心思想是面向接口编程
- 依赖倒转原则基于这样的设计理念:相对于细节的多变性,抽象的东西相对更加稳定;以抽象为基础构建的架构要更加稳定
- 使用接口的目的是制定好规范,而不涉及任何的细节实现;具体的细节交由实现类实现
- 依赖关系传递的三种方式
- 接口
- 构造方法
- setter方法
- 依赖倒转原则的注意事项和细节
- 底层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好
- 变量的声明类型尽量使用抽象类或接口,这样变量引用和实际对象之间,就存在一个缓冲层,有利于程序扩展和优化
- 继承时遵循里氏替换原则
(4)里氏代换原则(Liskov Substitution Principle,LSP)
- 定义:任何基类可以出现的地方,子类一定可以出现;即在设计一个子类的时候,子类可以完全去替换父类,而程序不会受到影响,子类也能够在父类的基础上扩展功能
- 说明
- 在使用继承时,尽量不要重写父类的方法
- 里氏替换原则告诉我们,继承实际上使两个类之间的耦合性增强了;可以考虑通过组合,聚合,依赖的方式来解决问题
(5)开闭原则(Open Closed Principle,OCP)
- 基本介绍
- 开闭原则是编程中最基础,最重要的设计原则
- 一个软件,比如其中的实体类,模块,函数应该对扩展开放(对提供方),对修改关闭(对使用方);用抽象构建框架,用实现扩展细节
- 当软件需要变化时尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化
- 编程中遵循寻其他原则,以及使用设计模式的目的就是遵循开闭原则
(6)迪米特法则(Law of Demeter)或最小知识原则(Principle of Least Knowledge,PLK)
- 基本介绍
- 一个对象应该对其他对象保持最少的了解
- 类与类之间关系越密切,耦合度越大
- 迪米特法则又叫最少知道原则,,即一个类对自己依赖的类知道的越少越好;也就是说,被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部,对外提供public方法
- 迪米特法则还有个更简单的定义:只与直接的朋友通信
- 直接的朋友:如果两个类之间有耦合关系,就说这两个类之间是朋友关系;耦合的方式有很多:组合,聚合,依赖,关联等;其中,出现在方法变量,类的成员变量,方法返回值中的类称为直接朋友,出现在方法内部的局部变量则不是直接朋友;换句话说,陌生的类最好不要以局部变量的形式出现在类的内部
- 注意事项和细节
- 迪米特法则的核心是降低类之间的耦合
- 迪米特法则只是要求降低类之间的耦合关系,并不是要求完全没有依赖关系
(7)合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
要尽量使用合成/聚合,而不是使用继承
4. 设计模式的核心思想
- 找出应用中可能需要变化的地方,把他们独立出来,不要和那些不需要变化的代码混在一起
- 针对接口编程,而不是针对实现编程
- 为了交互对象之间松耦合设计而努力
二、UML
1)概述
UML(Unified Modeling Language)统一建模语言,是一种软件系统分析和设计的语言工具
2)UML图分类
- 用例图
- 静态结构图:类图,对象图,包图,组件图,部署图
- 动态行为图:交互图(时序图与协作图),状态图,活动图
3)UML类图
- 虚线箭头指向依赖;
- 实线箭头指向关联;
- 虚线三角指向接口;
- 实线三角指向父类;
- 空心菱形能分离而独立存在,是聚合;
- 实心菱形精密关联不可分,是组合;
4)类之间的关系
![图片引用自其它博客
- 依赖:类中使用了其他类
- 类的成员变量
- 方法返回值
- 方法的参数
- 方法内部使用
- 泛化:实际上就是继承(依赖关系的特例)
- 实现:接口与实现类之间的关系
- 关联:
- 组合:部分与整体的关系(具有较强的关联)
- 聚合:个体与整体的关系(具有较弱的关联)
三、设计模式的类型
根据GOF设计模式在《Design Patterns - Elements of Reusable Object-Oriented Software》(设计模式 - 可复用的面向对象软件元素)提出的23种设计模式,这些模式分为三大类:创建型模式(Creational Patterns),结构型模式(Structural Patterns),行为型模式(Behavioral Patterns);当然还有其他的设计模式,比如:J2EE设计模式
模式 & 描述 | 包括 |
---|---|
创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 |
|
结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 |
|
行为型模式 这些设计模式特别关注对象之间的通信。 |
|
J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 |
|