面向对象之 开闭原则
我觉得开闭原则,就是对扩展开放对修改关闭,在我们写代码过程中,代码“写死”,就是因为没有遵循开闭原则来实现代码。就好比盖房子一样,地基就好比你的基础类,地基上面的房子就好比你的实现类,这时候房主说在房子上加一些修饰导致你必须修改地基,如果你去改变地基,你上面的房子都会受到影响,这时候你就会修补房子,让房子不会因为地基的修改而倒塌。如果这时候房主在说一些新的需求,而你的地基不足以支撑房主的需求,这时候你就可能要推倒重盖,为什么造成这种情况,就是因为你当初在搭建地基的时候没有遵循开闭原则,不支持对新需求的进行扩展。
下面用代码 说说开闭原则的好处
class house{ constructor(name){ this.name = name this.int() } int(){ console.log('搭建'+this.name+'流程:')
this.base();
this.wall();
this.roof(); } //地基 base(){ console.log('搭建地基') } //墙壁 wall(){ console.log('搭建墙壁') } //房顶 roof(){ console.log('搭建房顶') } } //创建普通民房 new house('普通民房')
//搭建普通民房流程:
//搭建地基
//搭建墙壁
//搭建房顶
house就是我创建的一个基础类,能制造出一个普通民房,如果我用它创建一个别墅那?别墅是不是得有阳台啊(我朋友工地得想抬杠找我,我帮你找份兼职),新需来了,然后我就在基础类上添加一个搭建阳台
class house{ //在house类里面新增//阳台 balcony(){ console.log('搭建阳台') } } //创建普通民房 new house('普通民房') //创建别墅 new house('别墅') //搭建普通民房流程: //搭建地基 //搭建墙壁 //搭建房顶 //搭建阳台 //搭建别墅流程: //搭建地基 //搭建墙壁 //搭建房顶 //搭建阳台
上面看到 普通民房怎么会有阳台那,这就是没有对修改得关闭,造成了普通民房也有了阳台。那普通民房肯定不能有阳台啊,但是我也得建造别墅带阳台呀,这时候我们就需要了对其进行扩展
class villa extends house{ constructor(name){ super(name) this.balcony(); } //阳台 balcony(){ console.log('搭建阳台') } } //创建普通民房 new house('普通民房') //创建别墅 new villa('别墅') //搭建普通民房流程: //搭建地基 //搭建墙壁 //搭建房顶 //搭建别墅流程: //搭建地基 //搭建墙壁 //搭建房顶 //搭建阳台
我创建了villa类对基础类进行了扩展,并且没有对基础类进行修改,符合了开闭原则得要求,实现了既能建造普通房屋,也通过扩展建造了别墅,避免了民房也出现阳台得现象。
在我们创建基础类时,我们要想到 建造房屋共同得特性,明确制定基础类之后不允许在进行修改,所以在我们写代码的时候不要着急去实现代码,要想到以后扩展得可能性,预留扩展接口,让你的代码能够支撑住新的需求,还有不要修改
基础类,修改基础类得时候,会影响你其他依赖基础的类,然后你就要去改动你依赖基础类的其他类,造成你修改代码的痛苦,最后可能就需要代码的重构,所以写代码的时候不要怕麻烦,要想好怎么写才能更好的扩展。
最后在说一遍 对修改关闭,对扩展开放 这就是开闭原则