只需低头努力,剩下的交给时光,时间会公平地帮你处理一切
什么是开闭原则?
开闭原则是面向对象编程领域中衍生出来的一种设计原则,说的是对扩展开放、对修改关闭
一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类来实现
开闭原则是最基础、最重要的设计原则,当软件需要扩展或修改时,尽量通过扩展实体来达到目的,而不是修改现有类
开闭原则容易实现吗?
开闭原则是一种理想的状态,当软件需要变更时,只做扩展不做修改,如果真能这样那就太完美了
可惜这个世界本身就不是完美的,我们在实际的开发过程中,总是在不停的修改
如果你有过几年的开发经验,想想有没有遇到下面这几种情况:
- 对于业务来说很小的需求,需要动底层的代码,牵一发而动全身
- 我们常常会给类增加功能,这可能是最方便的实现方式
- 迭代开发了几年的项目,基本上已经快改不动了,每一次改动都会引入新的问题,研发、测试每次都心惊胆颤
诚然,这其中肯定有设计不合理的地方,但从整体来看,开闭原则基本上是一种理想的状态,就好比要找一个百分百完美的人一样,那既然是一种理想状态,是不是我们就没有参考意义呢
该如何看待开闭原则?
开闭原则是一种理想状态,任何软件都无法严格的做到完全的不做修改,但我们可以尽量向多扩展少修改靠拢
我想开闭原则也不是说完全不做修改,只是修改的成本要远远大于扩展,因为修改现有的类就意味着对系统原有逻辑可能会产生影响,无形之中就增加了风险
我们在做软件模型设计的时候,就要考虑多扩展少修改,众多设计模式所遵循的底层原理就是开闭原则
开闭原则能让我们以最少的代价来达到软件变更的目的
举个例子
我们有一个裙子的基类
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天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您