七大设计原则之开闭原则

本文介绍了编程中的开闭原则,它强调软件实体对扩展开放,对修改关闭。通过一个画图形的功能案例,对比了传统方案与遵循开闭原则的解决方案,说明了如何在设计中实现对新功能的扩展而不修改原有代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、开闭原则介绍

        开闭原则(Open Closed Principle)是编程中最基础,也是最重要的设计原则。编程中遵循其他原则以及使用设计模式的目的就是遵循开闭原则。

       一个软件实体如类,模块和函数应该对(提供方)扩展开放,对(使用方)修改关闭。用抽象构建架构,用实现扩展细节。当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

二、案例讲解

实现一个画图形的功能,类图设计如下:

第一种解决方案:传统方案

代码实现如下:

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

}
public class Circle extends Shape{

    public Circle(){
        super.type = 2;
    }
}
public class GraphicEditor{

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

    public void drawRectangle(){
        System.out.println("绘制矩形");
    }

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

}
public class Test(){
    public static void main(String[] args){
        GraphicEditor editor = new GraphicEditor();
        editor.drawShape(new Rectangle());
        editor.drawShape(new Circle());
    }
}

       上面的实现方式比较好理解,简单易操作,但是如果这时要增加一个图形种类三角形,我们需要修改的地方很多,这就违反了开闭原则,即对扩展开放,对修改关闭。当我们给类添加新功能的时候,应该尽量不修改代码,或者尽可能少修改代码。

第二种解决方案:使用开闭原则       

      对上面代码改进思路:把创建Shape类做成抽象类,并提供一个抽象的draw方法,让子类去实现即可。这样有新的图形种类时,只需要让新的图形类继承Shape,并实现draw方法即可。使用方的代码就不需要修改,满足开闭原则。代码如下:

public abstract class Shape{
    int type;

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

    public void draw(){
        System.out.println("绘制矩形");
    }
}
public class Circle extends Shape{

    public Circle(){
        super.type = 2;
    }

    public void draw(){
        System.out.println("画圆形");
    }
}
public class GraphicEditor{

    public void drawShape(Shape s){
        s.draw();
    }
}
public class Test(){
    public static void main(String[] args){
        GraphicEditor editor = new GraphicEditor();
        editor.draw(new Rectangle());
        editor.draw(new Circle());
    }
}

注:类Shape、Rectangle、Circle是提供方,类GraphicEditor是使用方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值