设计模式原则综述
设计模式原则,顾名思义,就是在程序设计中应当遵守的原则,也是各种设计模式的基础。
设计模式常用的七大原则有:
1)单一职责原则
2)接口隔离原则
3)依赖倒置原则
4)里氏替换原则
5)开闭原则
6)迪米特法则
7)合成复用原则
本系列将分别对这些原则进行介绍。
单一职责原则
一、定义
单一职责原则(Single Responsibility Principle, SRP)
有且仅有一个原因引起类的变更
二、背景
在程序设计中,我们可能遇到这样的情况:
类T负责两个不同的职责:职责P1、P2。
在设计过程中,假设职责P1需求发生变化,
当由于职责P1需求发生改变而需要修改类T时,
就有可能会导致原本运行正常的职责P2功能发生故障。
也就是说,我们应该分别建立两个类T1、T2,使T1完成职责P1的需求,T2完成职责P2的需求。
这样,当修改类T1时,不会使职责P2发生故障;同理,当修改T2时,也不会使职责P1发生故障。
三、例子
假设我们需要实现一个让交通工具进行运行的程序。
public class SingleResponsibillity {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("motobike");
vehicle.run("car");
vehicle.run("plane");
}
}
class Vehicle{
public void run(String vehicle) {
System.out.println(vehicle + "is running in the street");
}
}
运行结果如下
这里就出现了问题:
motobike和car确实能在马路上跑,但是按照我们的常识可知,plane一般不会run in the street,当客户端上线后,我们的程序员发现了这个问题,怎么改呢?
如果我们还是使用唯一的类来实现,虽然也能够通过一系列的条件判断来决定run的方式,但是未免太过麻烦了。
我们知道,摩托车、汽车和飞机、轮船这些交通工具,运行的场景、方式并不相同。因此我们把不同方式的类进行细分。
我们这里通过不同的对vehicle接口的实现来完成细分。
public interface Vehicle {
public void run(String vehicle);
}
public class SingleResponsibillity {
public static void main(String[] args) {
Vehicle VehicleDriver = new LandVehicle();
VehicleDriver.run("motobike");
VehicleDriver.run("car");
VehicleDriver = new AirVehicle();
VehicleDriver.run("plane");
}
}
class LandVehicle implements Vehicle {
public void run(String vehicle) {
System.out.println(vehicle + " is running in the street");
}
}
class SeaVehicle implements Vehicle{
public void run(String vehicle) {
System.out.println(vehicle + "is acrossing the sea ");
}
}
class AirVehicle implements Vehicle{
public void run(String vehicle) {
System.out.println(vehicle + " is flying in the air");
}
}
这样,在我们需要修改任何一种运输工具的运行方式实现的时候,我们只需要修改各自的类而无需进行大面积的修改。
四、总结
遵循单一职责原的优点有:
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
提高类的可读性,提高系统的可维护性;
变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。