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

单一职责原则

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

  这里的职责是指类变化的原因。单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。

  该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在两个缺点:

    1.一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;

    2.当客户端需要该对象某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。

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

  单一职责同样也适用于方法。一个方法应该尽可能做好一件事情。如果一个方法处理的事情太多,其颗粒度就会变得很粗,不利于重用。

SingleResponsibility1.java

public class SingleResponsibility1 {
    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+"在公路上运行");
    }
}

SingleResponsibility2.java

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("轮船");
    }
}

/**
 * 遵守单一职责原则
 * 改动很大:即将类分解,同时修改客户端
 * 改进:直接修改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+"水中运行");
    }
}

SingleResponsibility3.java

public class SingleResponsibility3 {
    public static void main(String[] args) {
        Vehicle2 vehicle2 = new Vehicle2();
        vehicle2.run("汽车");
        vehicle2.runWater("轮船");
        vehicle2.runAir("飞机");
    }
}

/**
 * 在方法上遵守单一职责,但类上没有遵守单一职责原则.
 */
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+"在水中上运行");
    }
}
原文地址:https://www.cnblogs.com/clownAdam/p/13210953.html