目录
本文参考于:
参考资料
1.设计模式概述
参考资料
GOF – 四人组
设计模式概念 : 代码设计经验的总结,是解决特定问题的模板。为了提高代码的可重用性和可靠性。
2.设计模式分类
- 创造型设计模式
- 结构型设计模式
- 行为型设计模式
3.UML类图
-
类图元素: 类名、属性、方法
-
类名 : Name
-
属性 :
[可见性]属性名:类型[=默认值]
, (可见性: public : + ,private:- , protected : # ) -
方法 :
[可见性]名称(参数列表)[:返回类型]
-
-
接口图:
圆圈 + 接口名 + 方法 -
类之间的关系:
- 依赖 : —>
- 关联 :
实线
或<实线>
- 聚合 :
菱形---
部分属于整体 : 学校菱形---
老师 - 组合 :
实心菱形---
部分组成整体,有相同生命周期 - 泛化 :
三角形实线
指示类的继承关系 - 实现关系
三角形---
指示接口的实现
4.面向对象的设计原则
-
开闭原则
定义: 对拓展开放,对修改关闭
作用 : 提高代码可重用性、稳定性、可维护性。测试更方便
实现:抽象约束,封装变化 :即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。
-
里氏替换原则
定义: 通俗地说: 子类可以扩展父类的功能,但不能改变父类原有的功能。尽量不要进行重写操作。
作用:
- 避免继承中重写父类的方法,造成可复用性变差
- 保证了类的拓展不会给原有系统引入新的错误,降低错误的可能性。
例子: 正方形不是特殊的矩形。
长方形有长、宽两种属性。正方形继承长方形后,长和宽总是相等。长方形中长和宽能独立变化,正方形继承长方形后,重写改变边长的函数,使得长和宽同时变化。
如果设定一个resize方法,一直增加长方形的宽度,直到增加到宽度超过高度才可以。那么如果针对子类正方形的对象调用resize方法,这个方法会导致正方形的边不断地增加下去,直到溢出为止。
此时理式原则的破环造成了程序的错误。
-
依赖倒置原则
核心思想: 面向接口和抽象类编程,不要面向实现编程。
作用:
- 降低类之间的耦合性 (直接使用接口调用函数)
- 由于抽象层一般比实现层更稳定,所以系统稳定性能提高。
例子: 顾客从不同商店购买物品。假设商店有
结算
这个方法。如果不提供接口,顾客在不同商店购物就需要调用不同商店的函数,需要修改代码。而提供一个接口后,所有商店实例都使用共同的接口Shop,在不同商店结算不需要修改代码了。 -
单一职责原则
控制类的粒度大小, 将对象解耦,提高内聚性。(耦合性: 模块间联系紧密程度,耦合性越高,模块独立性越低)
(内聚性 : 模块内各元素联系紧密程度 , 内聚性越高,独立性越高)
-
接口隔离原则
定义:一个类对另一个类的依赖应该建立在最小的接口上
要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。优点:
- 模块粒度更小,系统更灵活,可维护性更高
- 专用接口能够更能体现模块功能,和层次
- 减少代码冗余
-
迪米特法则
定义: 只与你的直接朋友交谈,不跟“陌生人”说话. 软件实体之间无需通信就不应该直接通信,可以通过第三方转发.
优点:
- 降低了类之间的耦合度,提高了模块的相对独立性
实现方法:
- 从依赖者角度,只依赖该依赖的对象
- 从被依赖者的角度,只暴露该暴露的方法
类的设计上:
- 降低类成员的权限
- 不暴露类的属性成员,提供相应的访问器
-
合成复用原则
合成复用原则是 通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的. 新对象可以调用已有对象的功能,从而达到复用。
继承复用缺点:
- 父类的细节暴露给子类,破坏了封装性
- 子类父类耦合度高.不利于拓展和维护
- 复用灵活性低. 继承父类后类型已经确定.
合成复用优点:
- 维护了类的封装性.旧对象作为新对象的成员,新对象无法看到旧对象细节
- 耦合度低.
- 复用灵活性高. 如果指向旧对象的成员变量是接口,则可以动态引用实现了该接口的所有对象.
一、创建型模式
创建模式的特点: 将对象的创建和使用分离。降低系统耦合。使用者不需要关系对象的创建细节。
分类:
- 单列
- 简单工程
- 工厂方法
- 抽象工厂
- 建造者
1.1 单列模式
特点:
- 一个类只有一个实例对象
- 该对象仅由自己创建
- 单例类对外提供访问该单例的全局访问点
应用场景:
- 只需要产生一个对象的时候
- 对象需要被共享的时候。例如线程池。
实现方法:
-
懒汉法:
在类加载的时候初始化对象:线程安全。
private static final Person person = new Person() ;
-
饿汉法:
public static synchronized Person getInstance() { //在getInstance方法上加同步 if(instance==null) { instance=new Person(); } else { System.out.println("已经有一个总统,不能产生新总统!"); } return instance; }
特点:
线程安全,但多线程访问的时候效率低。getInstance被同步了。
-
双重检测:
public static Person getInstance() { if(instance==null) { synchronized