开闭原则

开闭原则

基本介绍
  • 1.开闭原则(Open Close Principle)是编程中最基础,也最重要的原则。
  • 2.一个软件实体如类,模块,和函数应该对扩展(增加)开放,对修改关闭。用抽象扩展结构,用实现扩展细节。
  • 3.当软件需求变化时,尽量通过扩展软件实体的方式来实现需求,而不是通过修改已有的代码开实现新需求。当然这一点很苛刻,因为有些需求,会不可避免的修改原有的软件实体。所以,OCP即是原则也是遵循其他原则和使用设计模式的目标。
应用案例
/**
 * @author 长名06
 * @version 1.0
 * 开闭原则 案例
 *
 */
public class Ocp1 {
    public static void main(String[] args) {
        new GraphicEditor().drawShape(new Circular());
        new GraphicEditor().drawShape(new Rectangle());
    }
}

class GraphicEditor {
    public void drawShape(Shape s) {
        if (s.type == 1)
            drawRectangle();
        else if(s.type == 2)
            drawCircular();
    }

    public void drawRectangle() {
        System.out.println("画出矩形");
    }

    public void drawCircular() {
        System.out.println("画出圆形");
    }
}

class Shape {
    int type;
}

class Rectangle extends Shape {
    public Rectangle() {
        super.type = 1;
    }
}

class Circular extends Shape {
    public Circular() {
        super.type = 2;
    }
}
分析

优点,好理解,代码实现简单。缺点,违反ocp原则,如果要新增一个图形三角形,需要修改的地方很多。

案例改进

改进思路,把创建Shape类做成抽象类,并提供一个抽象的draw()方法,让子类继承实现方法即可。这样有新的图形种类时,只需让新的图形种类继承Shape,并实现draw()方法即可,使用方的代码不用修改,符合了ocp要求。

/**
 * @author 长名06
 * @version 1.0
 */
public class Ocp {
    public static void main(String[] args) {
        Shape rectangle = new Rectangle();
        Shape circular = new Circular();
        Shape triangle = new Triangle();
        Shape diamond = new Diamond();

        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(rectangle);
        graphicEditor.drawShape(circular);
        graphicEditor.drawShape(triangle);
        graphicEditor.drawShape(diamond);
    }
}

//符合ocp原则的代码设计
//ocp Open Close Principle 开闭原则
//开闭原则,对于使用方关闭修改 对于提供方开放修改
//在实现功能的新增时,最好是扩展(新增)代码,而不是修改代码
class GraphicEditor{
    public void drawShape(Shape s){
        s.draw();
    }
}

abstract class Shape{
    public abstract void draw();
}

class Rectangle extends Shape{
    @Override
    public void draw() {
        System.out.println("画出矩形");
    }
}

class Circular extends Shape{
    @Override
    public void draw() {
        System.out.println("画出圆形");
    }
}

class Triangle extends Shape{
    @Override
    public void draw() {
        System.out.println("画出三角形");
    }
}

class Diamond extends Shape{
    @Override
    public void draw() {
        System.out.println("画出菱形");
    }
}
细节

ocp是系统设计的目标,只是尽可能达到ocp的要求,并不是一定要严格遵守这种原则,其他的原则也一样的,后面的设计模式的设计,就不是都满足七大原则。

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

posted @ 2023-08-30 23:12  长名06  阅读(42)  评论(0编辑  收藏  举报