1.设计模式七大原则
首先,请思考一个问题:我们根据什么原则来设计设计模式?
- 单一职责原则
- 接口隔离原则
- 依赖倒置原则
- 里氏替换原则
- 开闭原则
- 迪米特法则
- 合成复用原则
2. 单一职责原则
什么是单一职责原则?
- 一个类只负责一项职责
2.1 案例
- 方案一:
/**
* 单一职责原则
*/
public class SingleResponsOne {
public static void main(String[] args) {
Vehicle vehicle =new Vehicle();
vehicle.run("汽车");
vehicle.run("轮船");
}
}
class Vehicle {
public void run(String vehicleName) {
System.out.println(vehicleName + "在公路上运行");
}
}
现在请我们思考以下两个问题:
- 问题一:轮船是在公路上运行吗? 原因:Vehicle类负责了多个职责(汽车、轮船、飞机等),违反了单一职责
- 问题二:如果我要限制飞机在大雪天不能飞行呢? 原因:需要在run方法中做判断,汽车、轮船、飞机高度耦合在一起
- .方案二:
public class SingleResponsTwo {
public static void main(String[] args) {
RoadVehicle roadVehicle =new RoadVehicle();
roadVehicle.run("汽车");
AirVehicle airVehicle =new AirVehicle();
airVehicle.run("飞机");
WaterVehicle waterVehicle =new WaterVehicle();
waterVehicle.run("轮船");
}
}
class RoadVehicle {
public void run(String vehicleName) {
System.out.println(vehicleName + "在公路上运行");
}
}
class AirVehicle {
public void run(String vehicleName) {
System.out.println(vehicleName + "在空中飞行");
}
}
class WaterVehicle {
public void run(String vehicleName) {
System.out.println(vehicleName + "在水中航行");
}
}
问题:上面的代码虽然符合了单一职责原则,但是开销很大
设计原则是死的,人是活的。虽然单一职责原则定义一个类只负责一个职责,但我们可以将职责下沉到方法级别(方案三)
- 方案三1:
一个具有注脚的文本。
public class SingleResponsThree {
public static void main(String[] args) {
Vehicle2 v2 =new Vehicle2();
v2.runRoad("汽车");
v2.runAir("飞机");
v2.runWater("轮船");
}
}
class Vehicle2 {
public void runRoad(String vehicleName) {
System.out.println(vehicleName + "在公路上运行");
}
public void runAir(String vehicleName) {
System.out.println(vehicleName + "在空中飞行");
}
public void runWater(String vehicleName) {
System.out.println(vehicleName + "在水中航行");
}
}
2.2 总结
- 降低类的复杂度,一个类只负责一项职责。
- 提高类的可读性,可维护性
- 降低职责变更引起的风险
- 通常情况下,我们应当遵守单一职责原则;只有逻辑足够简单,且类中方法数量足够少时,我们才可以下沉职责在代码级违反单一职责原则,在方法级别保持单一职责原则。
推荐使用方案,将职责下沉到方法级。(注意:不是所有情况都要下沉职责,只有当类的方法很少时,才这么做) ↩︎