设计原则:开闭原则

只需低头努力,剩下的交给时光,时间会公平地帮你处理一切

什么是开闭原则?

开闭原则是面向对象编程领域中衍生出来的一种设计原则,说的是对扩展开放、对修改关闭

一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类来实现

开闭原则是最基础、最重要的设计原则,当软件需要扩展或修改时,尽量通过扩展实体来达到目的,而不是修改现有类

开闭原则容易实现吗?

开闭原则是一种理想的状态,当软件需要变更时,只做扩展不做修改,如果真能这样那就太完美了

可惜这个世界本身就不是完美的,我们在实际的开发过程中,总是在不停的修改

如果你有过几年的开发经验,想想有没有遇到下面这几种情况:

  • 对于业务来说很小的需求,需要动底层的代码,牵一发而动全身
  • 我们常常会给类增加功能,这可能是最方便的实现方式
  • 迭代开发了几年的项目,基本上已经快改不动了,每一次改动都会引入新的问题,研发、测试每次都心惊胆颤

诚然,这其中肯定有设计不合理的地方,但从整体来看,开闭原则基本上是一种理想的状态,就好比要找一个百分百完美的人一样,那既然是一种理想状态,是不是我们就没有参考意义呢

该如何看待开闭原则?

开闭原则是一种理想状态,任何软件都无法严格的做到完全的不做修改,但我们可以尽量向多扩展少修改靠拢

我想开闭原则也不是说完全不做修改,只是修改的成本要远远大于扩展,因为修改现有的类就意味着对系统原有逻辑可能会产生影响,无形之中就增加了风险

我们在做软件模型设计的时候,就要考虑多扩展少修改,众多设计模式所遵循的底层原理就是开闭原则

开闭原则能让我们以最少的代价来达到软件变更的目的

举个例子

我们有一个裙子的基类

class Dress {
    int color;
}

两个具体的裙子类

class BlackDress extends Dress{
    public BlackDress(){
        super.color = 1;
    }
}

class YellowDress extends Dress {
    public YellowDress(){
        super.color = 2;
    }
}

生产裙子的工厂类

class DressFactory{
    public void createDress(Dress dress){
        if(dress.color == 1){
            createBlackDress(dress);
        } else if(dress.color == 2){
            createYellowDress(dress);
        }
    }
    
    public void createBlackDress(Dress dress){
        System.out.println("生产黑色裙子");
    }
    
    public void createYellowDress(Dress dress){
        System.out.println("生产黄色裙子");
    }
    
}

main方法,创建一个工厂类,根据传入不同的裙子,打印不同的信息

publc static void main(String[] args){
    DressFactory factory = new DressFactory();
    factory.createDress(new BlackDress());
    factory.createYellowDress(new Yellow());
}

这是一个很常见的例子,那假如我们现在需要增加一个RedDress,需要修改什么?

  • 需要增加一个RedDress类
  • 工厂方法里面需要增加一个if判断,增加一个方法

这是明显的对修改开放,不符合开闭原则

下面我们来修改一下,看看效果

abstract class Dress {
    int color;
    public abstract void create();
}

class BlackDress extends Dress {
    public BlackDress(){
        super.color = 1;
    }
    
    public void create(){
        System.out.println("生产黑色裙子");
    }
}

class YellowDress extends Dress {
    public YellowDress(){
        super.color = 2;
    }
    
    public void create(){
        System.out.println("生产黄色裙子");
    }
}


class DressFactory{
    public void createDress(Dress dress){
        dress.create();   
    }
}


publc static void main(String[] args){
    DressFactory factory = new DressFactory();
    factory.createDress(new BlackDress());
    factory.createYellowDress(new Yellow());
}

以上我们需要新增一个RedDress,只需要继承Dress,其他代码不需要动,对于调用者来说是透明的

开闭原则是一个最基础的设计原则,也是很多设计模式遵循的最底层的原则,

上面简单的例子不足于说明开闭原则的精髓,想要理解透彻这个原理其实并不简单,需要深厚的设计功底,在平时的工作中要多加练习才能熟练掌握

如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值