概述
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。
设计模式是软件设计中常见问题的典型解决方案。 每个模式就像一张蓝图, 你可以通过对其进行定制来解决代码中的特定设计问题。
文章目录
- 概述
-
- 设计模式目的
- 设计模式常用的七大原则
-
- 单一职责原则
- 接口隔离原则
- 依赖倒转(倒置)原则
- 里氏替换原则
- 开闭原则
- 迪米特法则
- 合成复用原则
- 小结
- UML类图
-
- 类之间的关系
-
- 依赖关系
- 泛化关系
- 实现关系
- 关联关系
- 聚合关系
- 组合关系
- IDEA与Eclipse 使用UML类图
- 设计模式分类
-
- 根据目的来分
- 根据作用范围来分
- 23种设计模式
-
- 创建型模式
-
- 单例模式
- 原型模式
-
- 模式的结构
- 类图
- 对象的拷贝
-
- 浅拷贝
- 深拷贝
- 原型模式的注意事项和细节
- 适用场景
- 建造者模式
-
- 类图
-
- 模式结构
- 优缺点
- 代码
- 建造者模式的注意事项和细节
- 工厂模式
-
- 简单工厂
-
- 模式结构
- 类图
- 主要代码
- 优缺点
- 使用场景
- 工厂方法
-
- 模式结构
- 类图
- 代码实现
- 抽象工厂模式
-
- 模式结构
- 类图
- 模式的应用场景
- 与工厂模式的区别
- 与建造者模式的区别
- 代码实现
- 结构型模式
-
- 适配器模式
- 桥接模式
-
- 模式结构
- 类图
- 优缺点
- 应用场景
- JDBC 中的桥接模式
- 示例代码
- 装饰者模式
-
- 模式结构
- 类图
- IO结构中的装饰者模式
- 优缺点
- 应用场景
- 示例代码
- 组合模式
-
- 模式结构
- 类图
- 优缺点
- 应用场景
- 示例代码
- 外观模式
-
- 模式结构
- 类图
- 优缺点
- MyBatis中的外观模式
- 应用场景
- 示例代码
- 享元模式
-
- 模式结构
- 类图
- 优缺点
- 应用场景
- 示例代码
- 代理模式
- 行为型模式
-
- 模版模式
-
- 模式结构
- 类图
- Spring框架中的模板模式
- 优缺点
- 应用场景
- 示例代码
- 解释器模式
-
- 模式结构
- 类图
- 优缺点
- 应用场景
- Spring框架中的解释器模式
- 示例代码
- 命令模式
- 访问者模式
- 迭代器模式
- 观察者模式
- 中介者模式
- 备忘录模式
- 状态模式
- 策略模式
- 职责链模式
设计模式目的
- 代码重用性 (即:相同功能的代码,不用多次编写)
- 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
- 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
- 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
- 使程序呈现 高内聚(模块与模块之间紧密联系), 低耦合(功能与功能之间依赖性低)的特性
设计模式常用的七大原则
- 单一职责原则
- 接口隔离原则
- 依赖倒转(倒置)原则
- 里氏替换原则
- 开闭原则
- 迪米特法则
- 合成复用原则
单一职责原则
对类来说的,即一个类应该只负责一项职责。
单一职责原则注意事项和细节
- 降低类的复杂度,一个类只负责一项职责。
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则; 只有类中方法数量足够少,可以在方法级别保持单一职责原则
接口隔离原则
客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
将接口Interface 拆分为独立的几个接口, 让需要依赖的类分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则
接口隔离原则时,应该根据以下几个规则来衡量。
- 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
- 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
- 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
UML类图
UML 建模的核心是模型,模型是现实的简化、真实系统的抽象。UML 提供了系统的设计蓝图。当给软件系统建模时,需要采用通用的符 语言,这种描述模型所使用的语言被称为建模语言。在 UML 中,所有的描述由事物、关系和图这些构件组成。下图完整地描述了所有构件的关系。其中类图是其最重要的部分也是最常用的图
在UML类图中:
- 抽象类或抽象方法用斜体表示
- 如果是接口,则在类名上方加
- 字段和方法返回值的数据类型非必需
- 静态类或静态方法加下划线
类之间的关系
依赖、泛化(继承)、实现、关联、聚合与组合
依赖关系
只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编绎都通过不了 以下5中情况都是依赖关系
- 类中用到了对方
- 如果是类的成员属性
- 如果是方法的返回类型
- 是方法接收的参数类型
实现关系
实现关系实际上就是A类实现B接口,它是依赖关系的特例。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。
聚合关系
聚合关系表示的是整体和部分的关系,代表整体与部分可以分开。聚合关系是关联关系的特例,所以他具有关联的导航性与多重性
IDEA与Eclipse 使用UML类图
在IDEA中可以可以右键包然后选择Diagrams 选择类图,也可以使用快捷键crtl+alt+shift+u来显示类图,使用IDEA自带的需要先设计好程序后才能显示类图,即无法自己画类图,如果需要自己画类图则安装插件PlantUML Itegration
使用PlantUML Itegration 制作的建造者模式的UMl类图示例:具体使用规则参考 PlantUML Itegration插件 使用规则
根据作用范围来分
根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。
类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。
对象的拷贝
浅拷贝
浅拷贝就是只拷贝了对象的基本类型值和引用值,但被复制的对象引用类型的属性仍然指向原来的对象。说白了拷贝对象仅仅拷贝了原对象属性值的一个引用,此引用仍然指向相同的地址
String 除外 ,实现Cloneable 覆写Clone 方法 这个就是浅拷贝
String的内容保存在常量池中,所以对其做修改只是改变了成员变量所引用的常量池的串,不会影响其它拷贝对象中的该成员
深拷贝
就是对所有的属性都独立地复制一份。对于基本类型属性即是复制一份值(成员变量自会提供独立的空间),而对于引用类型的属性就是重新建立了一个一模一样的对象,引用值不再相同(不再指向同一个对象)
-
实现Cloneable 一层一层覆写Clone 方法 也可以实现深度拷贝
如果想实现引用数据的类型的属性也是引用类型的对象拷贝,则需要使用深度拷贝 -
直接使用Java的clone()可以实现深拷贝,
-
使用序列化实现深拷贝是一种好的方式,也可以考虑使用一些其它工具,如Spring的BeanUtils工具
public class Sheep implements Cloneable { private String name; private int age; private String color; private String address = "蒙古羊"; public Sheep friend; //是对象, 克隆是会如何处理 public Sheep(String name, int age, String color) {super();this.name = name;this.age = age;this.color = color; } public String getName() {return name; } public void setName(String name) {this.name = name; } public int getAge() {return age; } public void setAge(int age) {this.age = age; } public String getColor() {return color; } public void setColor(String color) {this.color = color; } public void setFriend(Sheep friend) {this.friend = friend; } public Sheep getFriend() {return friend; } @Override public String toString() {return "Sheep [name=" 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!