嘻哈说:开放封闭原则

栏目: 后端 · 前端 · 发布时间: 6年前

内容简介:之前我们已经说过:

之前我们已经说过:

《嘻哈说:单一职责原则》

《嘻哈说:里氏替换原则》

《嘻哈说:依赖倒置原则》

《嘻哈说:接口隔离原则》

《嘻哈说:迪米特法则》

集齐五个原则,就可以召唤神龙了。

神龙就是开放封闭原则,可以这样说: 它是其他五大原则的实现,是面向对象设计的终极目标

既然开放封闭原则这么高端大气上凳次,那我们赶紧来看一下开放封闭原则的定义。

一个软件实体应当 对扩展开放 ,但 对修改关闭

对扩展开放的意思是,我们可以肆无忌惮的增加新功能。

对修改关闭的意思是,对原有功能不会产生任何修改。

可以说这是写代码的最高境界。

遗憾的是,这种情况不可能发生。需求本身就是在修修改改,程序又是为需求服务的,代码不修改是不可能的。

我们要尽量做到的开放封闭原则。完全做到开放封闭原则,臣妾做不到哇!

嘻哈说:开放封闭原则

2、怎么做

大家可以思考下:怎么样才能做到对扩展开放,对修改封闭呢?

方法1:抽象一个接口或者抽象类,定义公共的方法,从而方便扩展。

方法2:引用接口或者抽象类,不依赖具体实现类。

方法3:接口和抽象类不能修改,可以继承接口或者抽象类从而达到扩展的目的。

这三个方法都在围绕着一个核心,是什么呢?

没错,就是 抽象

我们应该面向抽象编程,不要面向具体编程。

有没有似曾相识的感觉?

是的,依赖倒置原则中也曾经提到过这样的思想。

开放封闭原则是总纲,而依赖倒置原则是开放封闭原则一个非常好的实现。

还有里氏替换原则也是对开放封闭原则的一种非常良好的实现,所以我们可以直接用《嘻哈说:里氏替换原则》中的场景以及代码。

3、场景

八大菜系的厨师

番茄餐厅,经过兢兢业业的经营,从一家小型的餐馆成长为一家大型餐厅。

厨师:老板,咱们现在家大业大客流量也大,虽然我精力充沛,但我也架不住这么多人的摧残。

老板:摧残?你确定?

厨师:哪能,您听错了,是照顾,架不住这么多人的照顾。

老板:小火鸡,可以呀,求生欲很强嘛。那你有什么想法?

厨师:我觉得咱们可以引入八大菜系厨师,一来,什么菜系的菜就交给什么菜系的厨师,味道质量会更加的上乘,才能配的上我们这么高规格的餐厅。

老板:嗯,说的有点道理,继续说。

厨师:二来,人手多了,还可以增加上菜的速度,三来......

老板:有道理,马上招聘厨师,小火鸡,恭喜你,升官了,你就是未来的厨师长。因为你求生欲真的很强。

厨师长:谢谢老板。(内心:我求生欲很强?哪里强了?放学你别走,我让你尝尝我的厉害,给你做一桌子好菜)

求生欲果真很强。

4、实现

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类,从而避免修改给原有系统带来新的问题,这就是 对修改封闭


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Operating System Algorithms

Operating System Algorithms

Nathan Adams、Elisha Chirchir / CreateSpace Independent Publishing Platform / 2017-4-21 / USD 39.15

Operating System Algorithms will walk you through in depth examples of algorithms that you would find in an operating system. Selected algorithms include process and disk scheduling.一起来看看 《Operating System Algorithms》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具