设计模式七大原则之单一职责原则

概述

定义:不要存在多于一个导致类变更的原因。通俗的说,一个类、接口、方法只负责一项职责。

例如:类A负责两个不同职责:职责1,职责2,当职责1需求变更而修改A时,可能造成职责2执行错误,所有需要将类A的粒度分解为A1,A2。

原则上说,我们设计一个类的时候不应该设计成大而全的类,要设计粒度小、功能单一的类,如果一个类有两个或两个以上的不相干的功能,那么我们就说它违背了单一职责原则,应该把它拆分成多个功能单一、粒度更细的类。

案例演示

以交通工具案例来分析

方案一:

package singleResponsibility.demo1;

public class SingleResponsibility {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("摩托车");
        vehicle.run("汽车");
        //飞机也在路上运行?不合理,轮船呢?
        vehicle.run("飞机");
    }
}

//交通工具类
//方案一:
//问题:run方法违反了单一职责原则
//改进:根据交通工具运行方式不同,分解为不同类
class Vehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + " 在公路上运行...");
    }
}

方案二:

package singleResponsibility.demo2;

public class SingleResponsibility {
    public static void main(String[] args) {
        RoadVehicle  roadVehicle = new RoadVehicle();
        roadVehicle.run("摩托车");
        roadVehicle.run("汽车");
        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飞机");
        WaterVehicle waterVehicle = new WaterVehicle();
        waterVehicle.run("轮船");
    }
}

//方案二:
//优点:遵守了单一职责原则
//问题:改动很大,类的细分可能导致类的数量暴增,同时需要修改客户端
//改进:直接修改Vehicle类,增加交通工具的运行方式
class RoadVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + " 在公路上运行...");
    }
}

class AirVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + " 在天空运行...");
    }
}

class WaterVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + " 在水中运行...");
    }
}

方案三:

package singleResponsibility.demo3;

public class SingleResponsibility {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("摩托车");
        vehicle.runAir("飞机");
        vehicle.runWater("轮船");
    }
}

//方案三:
//优点:没有对原来的类做大的修改,只是增加方法,没有修改客户端代码,新增交通工具时调用新的运行方式即可
//虽然没有在类级别上遵守单一职责原则,但在方法级别上遵守了单一职责原则
class Vehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + " 在公路上运行...");
    }

    public void runAir(String vehicle) {
        System.out.println(vehicle + " 在天空运行...");
    }

    public void runWater(String vehicle) {
        System.out.println(vehicle + " 在水中运行...");
    }
}

单一职责原则的优点

单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。优点:

  • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
  • 提高类的可读性。复杂性降低,自然其可读性会提高。
  • 提高系统的可维护性。可读性提高,那自然更容易维护了。
  • 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。

注意事项

单一职责不意味着一个类中只有一个方法。

通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则

适当地违背单一职责原则有时候反而能提高开发效率,因此设计原则还是要按照实际需求来选择使用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值