• 面向对象编程原则(04)——开闭原则



    版权声明

    • 本文原创作者:谷哥的小弟
    • 作者博客地址:http://blog.csdn.net/lfdfhl

    参考资料

    1. 《大话设计模式》 作者:程杰
    2. 《Java设计模式》 作者:刘伟
    3. 《图解设计模式》 作者:结城浩
    4. 《重学Java设计模式》 作者:付政委
    5. 《Head First设计模式》作者:埃里克·弗里曼

    开闭原则概述

    开闭原则(Open-Closed Principle,OCP)由BertrandMeyer于1988年提出,它是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。

    该原则定义如下:

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

    Software entities should be open for extension,but closed for modification.

    在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。开闭原则就是指软件实体应尽量在不修改原有代码的情况下进行扩展。

    任何软件都需要面临一个很重要的问题,即它们的需求会随时间的推移而发生变化。当软件系统需要面对新的需求时应该尽量保证系统的设计框架是稳定的。如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。随着软件规模越来越大,软件寿命越来越长,软件维护成本越来越高,设计满足开闭原则的软件系统也变得越来越重要。

    为了满足开闭原则需对系统进行抽象化设计,抽象化是开闭原则的关键。在Java、 C#等编程语言中可以为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成。在很多面向对象编程语言中都提供了接口、抽象类等机制;可以通过它们定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。

    开闭原则案例

    搜狗输入法的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的偏好更换输入法的皮肤,也可以从网上下载新皮肤。这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(例如:DefaultSpecificSkin和HelloSpecificSkin)是其子类。用户可以根据需要选择或者增加新的主题而不需要修改原代码;所以,它是满足开闭原则的。

    在这里插入图片描述
    案例代码如下:

    在这里插入图片描述

    AbstractSkin

    package com.openclose01;
    /**
     * 本文作者:谷哥的小弟 
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public abstract class AbstractSkin {
        public abstract void display();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    SougouInput

    package com.openclose01;
    /**
     * 本文作者:谷哥的小弟 
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class SougouInput {
    
        private AbstractSkin skin;
    
        public void setSkin(AbstractSkin skin) {
            this.skin = skin;
        }
    
        public void display() {
            skin.display();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    DefaultSkin

    package com.openclose01;
    /**
     * 本文作者:谷哥的小弟 
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class DefaultSkin extends AbstractSkin {
    	@Override
        public void display() {
            System.out.println("默认皮肤");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    HelloSkin

    package com.openclose01;
    /**
     * 本文作者:谷哥的小弟 
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class HelloSkin extends AbstractSkin {
    	@Override
        public void display() {
            System.out.println("问候皮肤");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    Test

    package com.openclose01;
    /**
     * 本文作者:谷哥的小弟 
     * 博客地址:http://blog.csdn.net/lfdfhl
     */
    public class Test {
        public static void main(String[] args) {
            //第一步:创建搜狗输入法
            SougouInput sougouInput = new SougouInput();
            //第二步:创建皮肤
            //DefaultSkin skin = new DefaultSkin();
            HelloSkin skin = new HelloSkin();
            //第三步:将皮肤设置到输入法中
            sougouInput.setSkin(skin);
            //第四步:显示皮肤
            sougouInput.display();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    测试结果如下:

    在这里插入图片描述

  • 相关阅读:
    【高并发优化手段】基于Springboot项目
    GO 工程下载依赖操作流程(go mod)
    React 使用echarts绘制滚动圆图,底部文字竖直放置
    Spring MVC执行流程
    计算机视觉——飞桨深度学习实战-深度学习网络模型
    stable diffusion和midjourney哪个好
    搜索中常见数据结构与算法探究(二)
    为什么Proteus串口无法正常显示
    腾讯面试——算法岗实习&深度学习&CV方向
    css大屏转动效果
  • 原文地址:https://blog.csdn.net/lfdfhl/article/details/126665708