java设计模式学习笔记(二)之单一职责原则
前言:设计模式一共有7大原则,今天我来介绍第一种:单一职责原则
2.1基本介绍:
官方定义:所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
自己理解:对类来说的,即一个类只负责一个职责。
例子:比如类A有两个职责:职责1和**职责2.**当职责1发生变化,职责2不发生变化时:执行职责2时有可能发生错误(在职责2依赖职责1时可能发生错误)
下面代码将说明这个问题:
public class SingleDuty {
public static void main(String[] args) {
A a=new A();
a.duty1();
a.duty2();
}
}
public class A{
public void duty1(String param){
System.out.println("我是职责一");
}
public void duty2(String param){
//依赖职责一方法
duty1(param);
System.out.println("我是职责二");
}
}
从上面代码可以看出来职责二方法需要调用职责一的方法
当职责一的代码发生变化话:
public class SingleDuty {
public static void main(String[] args) {
A a=new A();
a.duty1();
a.duty2();
}
}
public class A{
//职责一方法不传入String类型参数
public void duty1(){
System.out.println("我是职责一");
}
public void duty2(String param){
//受到职责一方法不再传入String类型参数的影响,下面的调用将发生错误
duty1(param);
System.out.println("我是职责二");
}
}
受到职责一方法不再传入String类型参数的影响,下面的调用将发生错误 。
2.2单一职原则应用案例:
一个关于交通工在所在的交通通道运行
方式一:
public class SingleDuty {
public static void main(String[] args) {
//创建交通工具类
Vahicle vahicle=new Vahicle();
vahicle.run("汽车");
vahicle.run("飞机");
vahicle.run("摩托车");
}
}
public class Vahicle {
//交通工具在路地上跑
public void run(String vahicle){
System.out.println(vahicle+"在陆地上跑");
}
}
从方式一可以看出来他违反了单一职责原则,类vahicle具有两个职责:
运行职责和在陆地上职责所以需要进行改进优化。
方式二:
public class SingleDuty {
public static void main(String[] args) {
//创建交通工具类
RoadVahicle roadvahicle=new RoadVahicle();
AirVahicle airvahicle=new AirVahicle();
roadvahicle.run("汽车");
airvahicle.run("飞机");
roadvahicle.run("摩托车");
}
}
public class RoadVahicle {
//创建在陆地长运行的交通工具类
public void run(String vahicle){
System.out.println(vahicle+"在公路上运行");
}
}
//创建在天上运行的交通工具的类
public class AirVahicle {
//交通工具在路地上跑
public void run(String vahicle){
System.out.println(vahicle+"在天空上运行");
}
}
方式二将类分解两个类,这样就符合单一职责原则
但是这样做对于整体代码破坏太大,不仅需要将类分解成两个还需要将在客户端修改代码这样做代价太大
方式三:
public class SingleDuty {
public static void main(String[] args) {
//创建交通工具类
Vahicle vahicle=new Vahicle();
vahicle.runRoad("汽车");
vahicle.runAir("飞机");
vahicle.runRoad("摩托车");
}
}
public class Vahicle {
public void runRoad(String vahicle){
System.out.println(vahicle+"在陆地上跑");
}
public void runAir(String vahicle){
System.out.println(vahicle+"在天空上跑");
}
}
方式三虽然没在类上遵守单一职责原则,但是在方法级别上遵守了单一职责原则。这样进行修改没有对代码进行过多的修改
2.3单一职责原则注意事项和细节
1.降低类的复杂性,一个类只有负责一个职责。
2.提高类的可读性和可维护性。
3.降低类发生变化引起的风险。
4.通常情况下我们需要遵守单一职责原则的,但是在代码逻辑简单的时候可以在代码级违反单一职责原则。只有在类中方法特别少时可以在方法级别遵守单一职责原则。
缺点:如果一味追求这个单一职责,有时也会造成类的大爆炸。。。。。。。不过接口和方法应该遵循这个原则。