设计模式之七大原则-单一职责原则(Single Responsibility Principle)

1.基本介绍

 对类来说,即一个类应该只负责一项职责。如果类A负责两个不同的职责:职责1,职责2,当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2各自负责职责1和职责2

2.应用案例

 比如不同的交通工具的运行方式:汽车运行在公路上,飞机在空中运行,轮船在水中运行案例

  • 方式1:设计一个交通工具类,使用不同的交通工具运行

    public class SingleResponsibility1 {
        public static void main(String[] args) {
                Vehicle vehicle =new Vehicle();
                vehicle.run("汽车");
                vehicle.run("飞机");
                vehicle.run("轮船");
        }
    }
    
    class Vehicle{
        public  void  run(String vehicle){
            System.out.println(vehicle+"在公路上运行....");
        }
    }
    

    运行结果:

    汽车在公路上运行....
    飞机在公路上运行....
    轮船在公路上运行....
    

    由运行结果可知:
     1、飞机和轮船不应该在公路上运行,在run方法中,违反了单一职责原则
     2、解决方案:根据不同的交通工具运行方法不同,分解成不同的类

  • 不同交通工具运行方法分解成不同的类

    public class SingleResponsibility2 {
        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 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 + " 在水中运行....");
    
        }
    }
    

    运行结果:

    汽车 在公路上运行....
    飞机 在天空中运行....
    轮船 在水中运行....
    

    由运行结果可知:
     1、不同的交通工具采用了不同的运行方式,遵守了单一职责原则
     2、但是这样做的改动很大,即将类分类,同时修改客户端
     3、改进方法:在方法1的基础上直接修改Vehicle类,改动的代码会比较少

  • 不同交通工具运行方法在同一类采用不同方法运行

    public class SingleResponsibility3 {
    
        public static void main(String[] args) {
                Vehicle2 vehicle =new Vehicle2();
                vehicle.run("汽车");
                vehicle.runAir("飞机");
                vehicle.runWater("轮船");
        }
    }	
    class Vehicle2{
        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+" 在水中运行....");
        }
    }
    

    运行结果:

    汽车 在公路上运行....
    飞机 在天空中运行....
    轮船 在水中运行....
    

    由运行结果可知:
     1、这种修改方法没有对原来的类做很大的修改,只是增加了方法,根据不同的实现方式调用不同的方法
     2、虽然没有在类级别上遵守单一职责原则,但是在方法级别上,仍然遵守单一职责

由以上的案例得知为什么要遵守单一职责原则?
 比如公路上运行的汽车增加对尾号限行的需求,我们只需要修改负责在公路上运行的汽车的功能即可,无需修改在天空中或水中运行的方法,这样修改完成后只需要测试修改过公路运行的方法即可,降低变更引起的风险。

3.注意事项和细节

  1. 降低类的复杂度,一个类只负责一项职责
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 通常情况下:应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值