文章目录
七大设计原则
单一职责模式
- 降低类的复杂度,一个类只负责一项职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 在类中方法数量足够少时,我们可以在方法级别上保持单一职责原则
接口隔离原则
一个类对另一个类的依赖应该建立在最小的接口上
- 没有使用接口隔离原则的关系图
- 使用接口隔离原则的关系图
依赖倒转原则
- 高层模块不应该以来低层模块,二者都应该依赖其抽象
- 抽象(抽象类、接口)不应该依赖细节(实现类),细节应该依赖抽象
- 依赖倒转的中心思想是面向接口编程
为什么要面向接口编程?
相对于细节的多变性,抽象的东西更加稳定,以抽象为基础搭建的架构比以细节搭建起来的架构要稳定的多
接口或者抽象类的任务是去制定好规范,把展示细节的任务交给实现类去完成
注意事项:
- 低层模块尽量都要有抽象类或接口,这样程序的稳定性好
- 变量的声明类型尽量是抽象类或接口(多态)【 Animal cat = new cat(); 】,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序的扩展和优化
- 继承时遵循里氏替换原则
依赖关系传递的3种方式
-
接口传递
//打开电视的接口 interface IOpenTV{ public void open(ITV tv); } //电视接口 interface ITV{ public void play(); } //打开电视并播放 class OpenTv implements IOpenTV{ @Override public void open(ITV tv) { tv.play(); } }
-
构造方法传递
interface IOpenTV{ public void open(); } //电视接口 interface ITV{ public void play(); } //打开电视并播放 class OpenTv implements IOpenTV{ public ITV tv; //通过构造器传递 public OpenTv(ITV tv) { this.tv = tv; } @Override public void open() { this.tv.play(); } }
-
setter 方式传递
interface IOpenTV{ public void open(); public void setTv(ITV tv); } //电视接口 interface ITV{ public void play(); } //打开电视并播放 class OpenTv implements IOpenTV{ private ITV tv; @Override public void setTv(ITV tv) { this.tv = tv; } @Override public void open() { this.tv.play(); } }
里氏替换原则
在继承中要遵守里氏替换原则
在子类中尽量不要重写父类的方法
继承实际上让两个类的耦合性增强了,子类重写了父类的方法会导致在多态的使用中出现问题
为了解决这个问题:
如果子类要重写父类的方法,我们尽量将子类与父类提升到一个更抽象的基类,是两个类之间不再是继承关系,适当情况下,通过聚合,组合,依赖来解决问题。
开闭原则
- 开闭原则是编程中最基础、最重要的设计原则,编程中遵循其他原则,使用设计模式的目的就是遵循开闭原则
- 一个软件实体(类)模块和函数应该对扩展开放(提供方),对修改关闭(使用方)
- 用抽象构建框架,用实现扩展细节
- 当软件需求发生变化时,尽量通过扩展来实现变化,而不是通过修改已有的代码来实现变化(尽量增加新的类来实现变化的需求,尽量不动已有的类)
迪米特法则
迪米特法则的核心是降低类之间的耦合(减少不必要的依赖),而不是完全没有依赖关系。
迪米特法则又叫 最少知道原则,即一个类对自己依赖的类知道的越少越好
迪米特法则还有个最简单的定义:只与直接朋友通信
直接朋友:出现在成员变量、方法参数、方法返回值种的类为直接朋友
//其中 B 就是 A 的直接朋友 class A{ public B b = new B(); public B method(B b){ } }
陌生类:以局部变量的形式出现在类的内部
//其中 C 就是 A 的陌生类 class A{ public B b = new B(); public B method(B b){ C c = new C(); } }
合成复用原则
只是为了使用某个类中的方法,尽量使用合成/聚合的方式,而不是继承
-
继承
-
依赖【B类中有方法:void method(A a)】
-
聚合【B类中有成员变量:public A a; setA】
-
组合【B类中有成员变量:public A a = new A()】
UML 类图
UML(Unified modeling language)统一建模语言,是把自己的思路描述给别人看。
类图是描述类(对象)本身的组成和类(对象)之间的静态关系,是 UML 图中最核心的。
类与类之间的关系:依赖、泛化(继承)、实现、关联、聚合、组合
依赖关系
只要是在类中用到了对方,那么他们之间就存在依赖关系,如果没有对方,编译也无法通过。
- 如果是类的成员属性
- 如果是方法的返回类型
- 是方法接收的参数类型
- 方法中使用到
泛化关系
-
泛化关系就是继承关系,一种依赖关系的特例。
实现关系
是依赖关系的特例
关联关系
-
关联具有导航性(双向关系、单向关系),是依赖关系的特例
聚合关系
整体与部分可以分离,聚合关系是关联关系的特例
组合关系
整体和部分不可以分离,是关联关系的一种特例
class Person{
private Head head = new Head(); //这就是组合关系,在new Person的时候,new Head也会进行Person和Head是不能分离的
private IDCard card; //这就是聚合关系,Person 和 IDCar 是可以分离的
}
但是会存在一个特殊情况:
如果程序中Person实体类中定义了对IDCard进行级联删除,那么此时就是组合关系。
各种关系的联系
//这就是组合关系,在new Person的时候,new Head也会进行Person和Head是不能分离的
private IDCard card; //这就是聚合关系,Person 和 IDCar 是可以分离的
}
[外链图片转存中...(img-d9gMDH4T-1593924547473)]
> 但是会存在一个特殊情况:
>
> 如果程序中Person实体类中定义了对IDCard进行==级联删除==,那么此时就是组合关系。
### 各种关系的联系
![image-20200628084431993](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20vRmFuWGluZy00MjkvbXlCbG9nL3Jhdy9tYXN0ZXIvaW1nL2ltYWdlLTIwMjAwNjI4MDg0NDMxOTkzLnBuZw?x-oss-process=image/format,png)