以前咱们已经说过:html
《嘻哈说:里氏替换原则》bash
《嘻哈说:依赖倒置原则》app
《嘻哈说:接口隔离原则》ide
《嘻哈说:迪米特法则》post
集齐五个原则,就能够召唤神龙了。学习
神龙就是开放封闭原则,能够这样说:它是其余五大原则的实现,是面向对象设计的终极目标。ui
既然开放封闭原则这么高端大气上凳次,那咱们赶忙来看一下开放封闭原则的定义。spa
一个软件实体应当对扩展开放,但对修改关闭。设计
对扩展开放的意思是,咱们能够肆无忌惮的增长新功能。
对修改关闭的意思是,对原有功能不会产生任何修改。
能够说这是写代码的最高境界。
遗憾的是,这种状况不可能发生。需求自己就是在修修改改,程序又是为需求服务的,代码不修改是不可能的。
咱们要尽可能作到的开放封闭原则。彻底作到开放封闭原则,臣妾作不到哇!
你们能够思考下:怎么样才能作到对扩展开放,对修改封闭呢?
方法1:抽象一个接口或者抽象类,定义公共的方法,从而方便扩展。
方法2:引用接口或者抽象类,不依赖具体实现类。
方法3:接口和抽象类不能修改,能够继承接口或者抽象类从而达到扩展的目的。
这三个方法都在围绕着一个核心,是什么呢?
没错,就是抽象。
咱们应该面向抽象编程,不要面向具体编程。
有没有似曾相识的感受?
是的,依赖倒置原则中也曾经提到过这样的思想。
开放封闭原则是总纲,而依赖倒置原则是开放封闭原则一个很是好的实现。
还有里氏替换原则也是对开放封闭原则的一种很是良好的实现,因此咱们能够直接用《嘻哈说:里氏替换原则》中的场景以及代码。
八大菜系的厨师
番茄餐厅,通过兢兢业业的经营,从一家小型的餐馆成长为一家大型餐厅。
厨师:老板,我们如今家大业大客流量也大,虽然我精力充沛,但我也架不住这么多人的摧残。
老板:摧残?你肯定?
厨师:哪能,您听错了,是照顾,架不住这么多人的照顾。
老板:小火鸡,能够呀,求生欲很强嘛。那你有什么想法?
厨师:我以为我们能够引入八大菜系厨师,一来,什么菜系的菜就交给什么菜系的厨师,味道质量会更加的上乘,才能配的上咱们这么高规格的餐厅。
老板:嗯,说的有点道理,继续说。
厨师:二来,人手多了,还能够增长上菜的速度,三来......
老板:有道理,立刻招聘厨师,小火鸡,恭喜你,升官了,你就是将来的厨师长。由于你求生欲真的很强。
厨师长:谢谢老板。(心里:我求生欲很强?哪里强了?放学你别走,我让你尝尝个人厉害,给你作一桌子好菜)
求生欲果然很强。
package com.fanqiekt.principle.liskov;
/**
* 抽象厨师类
*
* @author 番茄课堂-懒人
*/
public abstract class Chef {
/**
* 作饭
* @param dishName 餐名
*/
public void cook(String dishName){
System.out.println("开始烹饪:"+dishName);
cooking(dishName);
System.out.println(dishName + "出锅");
}
/**
* 开始作饭
*/
protected abstract void cooking(String dishName);
}
复制代码
抽象厨师类,公有cook方法,负责厨师作饭的一些相同逻辑,例如开始烹饪的准备工做,以及出锅。
具体作饭的细节则提供一个抽象方法cooking(正在作饭),具体菜系厨师须要重写该方法。
package com.fanqiekt.principle.liskov;
/**
* 山东厨师
*
* @author 番茄课堂-懒人
*/
public class ShanDongChef extends Chef{
@Override
protected void cooking(String dishName) {
switch (dishName){
case "西红柿炒鸡蛋":
cookingTomato();
break;
default:
throw new IllegalArgumentException("未知餐品");
}
}
/**
* 炒西红柿鸡蛋
*/
private void cookingTomato() {
System.out.println("先炒鸡蛋");
System.out.println("再炒西红柿");
System.out.println("...");
}
}
复制代码
鲁菜厨师ShanDongChef继承了厨师抽象类Chef,实现了抽象方法cooking。
新增西红柿炒鸡蛋的功能,咱们能够经过继承Chef抽象类实现ShanDongChef类进行扩展,这就是对扩展开放。
避免修改Chef类,从而避免修改给原有系统带来新的问题,这就是对修改封闭。
接下来,请您欣赏开放封闭原则的原创歌曲。
嘻哈说:接口隔离原则
做曲:懒人
做词:懒人
Rapper:懒人
对扩展开放
对修改封闭
对具体来说
要大胆痛击
对抽象爱上
编程就会容易
开放封闭我中意疯迷
作番茄鸡蛋能够新增山东大厨
而不是在厨师类里大修大补
不然代码就像狂风中的蜡烛
随时可能一命呜呼
复制代码
闲来无事听听曲,知识已填脑中去;
学习复习新方式,头戴耳机不小觑。
番茄课堂,学习也要酷。