嘻哈说:开放封闭原则

栏目: 后端 · 前端 · 发布时间: 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类,从而避免修改给原有系统带来新的问题,这就是 对修改封闭


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

查看所有标签

猜你喜欢:

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

数据驱动设计

数据驱动设计

[美]罗谢尔·肯(RochelleKing)、[美]伊丽莎白F.邱吉尔(Elizabeth F Churchill)、Caitlin Tan / 傅婕 / 机械工业出版社 / 2018-8 / 69.00元

本书旨在帮你了解数据引导设计的基本原则,了解数据与设计流程整合的价值,避免常见的陷阱与误区。本书重点关注定量实验与A/B测试,因为我们发现,数据分析与设计实践在此鲜有交集,但相对的潜在价值与机会缺大。本书提供了一些关于在组织中开展数据实践的观点。通过阅读这本书,你将转变你的团队的工作方式,从数据中获得大收益。后希望你可以在衡量指标的选择、佳展示方式与展示时机、测试以及设计意图增强方面,自信地表达自......一起来看看 《数据驱动设计》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具