开闭原则

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。开闭原则,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

开闭原则

基本介绍
  • 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的要求,并不是一定要严格遵守这种原则,其他的原则也一样的,后面的设计模式的设计,就不是都满足七大原则。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/213086.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!