设计原则之开闭和单一职责原则

485 阅读3分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

1.开闭原则

开闭原则是我们在编程中最基础也是最重要的原则,开就是对扩展开放,闭就是对修改关闭

对扩展开发:如类:对于提供者,他要求模块和函数是可扩展的

对修改关闭:如类:对于使用者,对模块和函数是不可以修改,只可以调用

这样有什么好处呢:

当软件需求发生变化?是直接去修改原来的代码吗,当然是不可行的 ,如果系统庞大 修改了原来的代码将会导致不可预估的影响。因此在需求变化时我们可以扩展软件实体去应对变化。其实在设计模式中也会用到这些原则

  • 代码举例 一个代码功能是画图 画一个矩形 应该怎么设计 如果直接写是这样:

image.png

public class DrawEditor {
    public void drawShape(Shape shape){
        if (shape.shape_data == 1) DrawRectangle(shape);
        else if (shape.shape_data == 2) DrawCircle(shape);
    }
    public void DrawRectangle(Shape s){
        System.out.println("画矩形");
    }
    public void DrawCircle(Shape s){
        System.out.println("画圆形");
    }
}

//Shape类
public class Shape {
    int shape_data;
}

//矩形类 圆类一样
public class Rectangle extends Shape{
    Rectangle(){
        super.shape_data=1;
    };

}
  • 仔细观察上述代码是否满足了开闭原则

现在想画一个三角形,我需要增加一个三角形的类,继承了Shape,但是并没有扩展功能,同时还需要去DrawEditor这个类中加判断 即修改了提供方所提供的源码 这样明显不满足对扩展开发和对修改关闭

  • 这是需要进行改进:

将Shape类改进为抽象类,并提供一个抽象方法draw方法,让子类去实现即可,这样有新的图形种类时, 只需要让新的图形类继承Shape,并实现draw方法即可,使用方的代码就不需要修改,满足开闭原则 修改后:

public class DrawEditor {
    public void drawShape(Shape shape){
       shape.draw();
    }
}

//Shape类
public abstract class Shape {
    int shape_data;

    public abstract void draw();
}

//矩形类 圆类一样
public class Rectangle extends Shape{
    Rectangle(){
        super.shape_data=1;
    };
    @Override
    public void draw() {
        System.out.println("画矩形");
    }
}

这样修改过的代码,当想增加一个画三角形,我只需要让三角形类集成Shape再实现draw方法即可,这样提供方就对扩展开放,而对修改即DrawEditor是关闭的 则就满足了开闭原则。

2.单一职责原则

从字面意思就很好理解这一原则,就拿类来说,一般一个类应该只负责一个职责。具体看代码

public class transportSelect {
    public static void main(String[] args) {
        Vechicle vechicle = new Vechicle();
        vechicle.run("汽车");
        vechicle.run("飞机");
        vechicle.run("轮船");
    }
}

//工具出现类
public class Vechicle {
    public void run(String vecicle){
        System.out.println(vecicle + "在公路上行驶");
    }
}

仔细阅读上面代码 会存在什么问题:

违反了单一职责原则,一个类负责了多个职责。水陆空的交通工具都调用这个类 如何解决呢?

这是需要将交通工具这个类进行分解,陆地对应陆地交通工具,如果这样一个类对应一个方法,改动会很大,可以选择一个改动相对较少的办法:

public class transportSelect {
    public static void main(String[] args) {
        Vechicle vechicle = new Vechicle();
        vechicle.run("汽车");
        vechicle.fly("飞机");
        vechicle.water("轮船");
    }
}


public class Vechicle {
    public void run(String vecicle){
        System.out.println(vecicle + "在公路上行驶");
    }
    public void fly(String vecicle){
        System.out.println(vecicle + "在天上行驶");
    }
    public void water(String vecicle){
        System.out.println(vecicle + "在水中行驶");
    }
}

这里虽然没有做到是在类级别上满足单一职责原则,但在方法上,任然满足的是单一职责原则。 满足单一职责原则可以降低类的负责度,也能提高代码可读性和可维护性。