面向对象【Object Oriented】
四大特性:封装,继承,抽象,多态

一份好的对象设计,往往是以对象为中心,充分利用接口和多态来停供灵活性【应对变化,提高复用】

目标

可扩展性

有了新的需求,新的性能可以容易添加到系统中,不影响现有的性能,也不会带来新的缺陷

可修改性

系统一部分的代码要修改时不会破坏系统的现有结构,也不会影响到其它的部分

可替换性

可以将系统中的某些代码替换为相同接口的其它类,不会影响到系统

七大设计原则

设计原则名称 定 义 使用频率
单一职责原则(Single Responsibility Principle, SRP) 一个类只负责一个功能领域中的相应职责 ★★★★☆
开闭原则(Open-Closed Principle, OCP) 软件实体应对扩展开放,而对修改关闭 ★★★★★
里氏代换原则(Liskov Substitution Principle, LSP) 所有引用基类对象的地方能够透明地使用其子类的对象 ★★★★★
依赖倒转原则(Dependence Inversion Principle, DIP) 抽象不应该依赖于细节,细节应该依赖于抽象 ★★★★★
接口隔离原则(Interface Segregation Principle, ISP) 使用多个专门的接口,而不使用单一的总接口 ★★☆☆☆
合成复用原则(Composite Reuse Principle, CRP) 尽量使用对象组合,而不是继承来达到复用的目的 ★★★★☆
迪米特法则(Law of Demeter, LoD) 一个软件实体应当尽可能少地与其他实体发生相互作用 ★★★☆☆

单一职责原则

  • 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小
  • 单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责 并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验

单一职责原则原则的核心含意是:只能让一个类/接口/方法有且仅有一个职责。
违反单一职责原则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.weirdo.principle.singleResponsibility;

public class SingleResponsibility1 {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("摩托车");
vehicle.run("汽车");
vehicle.run("飞机");
}

//交通工具类
static class Vehicle{
public void run(String vehicle){
System.out.println(vehicle+"在公路上运行...");
}
}
}

遵循单一职责原则【类级】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.weirdo.singleResponsibility;

public class SingleResponsibility2 {
public static void main(String[] args) {
RoadVehicle roadVehicle = new RoadVehicle();
roadVehicle.run("摩托车");
roadVehicle.run("汽车");
AirVehicle airVehicle = new AirVehicle();
airVehicle.run("飞机");
}
static class RoadVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "在公路上运行...");
}
}
static class AirVehicle {
public void run(String vehicle) {
System.out.println(vehicle + "在天上上运行...");
}
}
}

遵循单一职责原则【方法级】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.weirdo.singleResponsibility;

public class SingleResponsibility3 {

public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.runAir("飞机");
vehicle.runRoad("汽车");
vehicle.runWater("航母");
}

static class Vehicle {
public void runRoad(String vehicle) {
System.out.println(vehicle + "在公路上运行...");
}
public void runAir(String vehicle) {
System.out.println(vehicle + "在公路上运行...");
}
public void runWater(String vehicle) {
System.out.println(vehicle + "在水里运行...");
}
}
}

注意点:

  • 降低类的复杂度,一个类只负责属于自己的职责
  • 提高类的可读性,可维护性
  • 通常情况下,只有在逻辑足够简单的时候才可以违反单一职责原则,因为过度设计会导致物极必反
    开闭原则
  • 开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则
  • 抽象化是开闭原则的关键

https://juejin.cn/post/6979029066296852511
https://juejin.cn/post/6844904051868434446
https://juejin.cn/post/7087483087403089934