这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
1.开闭原则
开闭原则是我们在编程中最基础也是最重要的原则,开就是对扩展开放,闭就是对修改关闭
对扩展开发:如类:对于提供者,他要求模块和函数是可扩展的
对修改关闭:如类:对于使用者,对模块和函数是不可以修改,只可以调用
这样有什么好处呢:
当软件需求发生变化?是直接去修改原来的代码吗,当然是不可行的 ,如果系统庞大 修改了原来的代码将会导致不可预估的影响。因此在需求变化时我们可以扩展软件实体去应对变化。其实在设计模式中也会用到这些原则
- 代码举例 一个代码功能是画图 画一个矩形 应该怎么设计 如果直接写是这样:
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 + "在水中行驶");
}
}
这里虽然没有做到是在类级别上满足单一职责原则,但在方法上,任然满足的是单一职责原则。 满足单一职责原则可以降低类的负责度,也能提高代码可读性和可维护性。