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

单一职责原则

基本介绍

Simple Responsibility Principle(SRP)一个类或者模块只负责完成一个职责(或者功能)

如何理解单一职责原则?

类和模块的两种理解:

  1. 把模块看作比类更加抽象饿概念,类也可以看作模块
  2. 把模块看作壁垒更加粗粒度的代码快,模块中包含多个类,多个类组成一个模块

如何判断类的职责是否单一?

  • 类中代码行数、函数或属性过多
  • 类依赖的其他类过多,或者依赖类的其他类过多,不符合高内聚、低耦合的设计思想
  • 私有方法过多
  • 比较难给类一个合适的名字,很难用一个业务名称概括,或者只能用一些笼统的Manager、Context之类的词语来命名
  • 类中大量的方法都是操作类中的几个属性

类的职责是否设计的越单一越好?

不是。不管是应用设计原则还是设计模式,最终的目的还是提高代码的可读性、可扩展性、复用性、可维护性

应用实例

以交通工具类为例

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

注: 在方式1中的run方法中,违反了单一职责原则

解决方式

  • 根据交通工具运行方法不同,分解成不同的类
public class SingleResponsibility02 {

    public static void main(String[] args) {
        RoadVehicle roadVehicle = new RoadVehicle();
        roadVehicle.run("摩托车");
        roadVehicle.run("汽车");

        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飞机");
    }
}
/**
 * 1.遵守单一职责原则
 * 2.但是这样做的改动太大,即将类分解,同时修改客户端
 * 3.改进:直接修改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 + "水中运行");
    }
}
  • 根据交通工具运行方法不同,在交通工具类中增加不同的方法
public class SingleResponsibility03 {

    public static void main(String[] args) {
        Vehicle03 vehicle = new Vehicle03();
        vehicle.runAir("飞机");
        vehicle.runRoad("汽车");
        vehicle.runWater("轮船");
    }
}

//方式3的分析
//1. 这种修改方法没有对原来的类做大的修改,只是增加方法
//2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责
class Vehicle03 {

    public void runRoad(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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值