开闭原则

对扩展开放,对修改关闭

在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。

想要达到这样的效果,我们需要使用接口和抽象类

因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。

软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

下面以 搜狗输入法 的皮肤为例介绍开闭原则的应用。

【例】搜狗输入法 的皮肤设计。

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



AbstractSkin.java

package com.itheima.principles.demo1;/*** @version v1.0* @ClassName: AbstractSkin* @Description: 抽象皮肤类*/
public abstract class AbstractSkin {//显示的方法public abstract void display();
}

DefaultSkin.java

package com.itheima.principles.demo1;/*** @version v1.0* @ClassName: DefaultSkin* @Description: 默认皮肤类*/
public class DefaultSkin extends AbstractSkin {public void display() {System.out.println("默认皮肤");}
}

HeimaSkin.java

package com.itheima.principles.demo1;/*** @version v1.0* @ClassName: HeimaSkin* @Description: 黑马皮肤*/
public class HeimaSkin extends AbstractSkin {public void display() {System.out.println("黑马皮肤");}
}

SougouInput.java

package com.itheima.principles.demo1;/*** @version v1.0* @ClassName: SougouInput* @Description: 搜狗输入法* @Author: dym*/
public class SougouInput {private AbstractSkin skin;public void setSkin(AbstractSkin skin) {this.skin = skin;}public void display() {skin.display();}
}

测试代码

package com.itheima.principles.demo1;/*** @version v1.0* @ClassName: Client* @Description: TODO(一句话描述该类的功能)* @Author: dym*/
public class Client {public static void main(String[] args) {//1,创建搜狗输入法对象SougouInput input = new SougouInput();//2,创建皮肤对象//DefaultSkin skin = new DefaultSkin();HeimaSkin skin = new HeimaSkin();//3,将皮肤设置到输入法中input.setSkin(skin);//4,显示皮肤input.display();}
}

软件设计原则——开闭原则相关推荐

  1. 面向对象软件设计的“开—闭”原则

    1.什么是开闭原则         "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...

  2. 一周技术学习笔记(第67期)-CPU的设计跟开闭原则有关系吗

    你能想到CPU的设计是开闭原则的设计吗 说CPU的设计很符合软件设计的开闭原则,估计一般的同学肯定不会这样意识到.其实我也一样不太可能把它们能够想在一起,并将它们关联起来. 可确实就这样发生了.实际上 ...

  3. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

    前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...

  4. 六大设计原则--开闭原则

    定义 software entities like classes, modules and functions should be open for extension but closed for ...

  5. 六大设计模式原则-开闭原则

    一.开闭原则定义 开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则.定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修 ...

  6. 设计模式6大原则-开闭原则

    设计模式6大原则-开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开闭原则理念就是当需求改变时,希望在不改变原有代码的前提下,通过扩展模块.函数来满足新需求. 开闭原则是其他 ...

  7. 设计模式之王者原则 开闭原则

    设计模式之王者原则  开闭原则 为什么说 它--开闭原则是王者原则呢? 因为所有原则都是围绕它来实现的,怎么说呢,为什么会有这么多原则呢,都是为了完成它,只要实现它你的代码就不会有什么大的问题 一.定 ...

  8. 【设计模式】软件设计七大原则 ( 开闭原则 )

    文章目录 一.开闭原则简介 二.开闭原则代码示例 1.商品接口 2.普通商品类 3.折扣商品类 4.测试类 一.开闭原则简介 开闭原则 : 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 ...

  9. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 这 7 种设计原则是软件设计 ...

最新文章

  1. LVS_NAT实现负载均衡
  2. 黑金花大理石_黑金花 , 经典就是经典 ! 美 !
  3. 互联网营销离不开“SEO”
  4. mysql更新一个表里的字段等于另一个表某字段的值
  5. Loj 【CQOI 2006】简单题,mmp
  6. 机器学习系列2:从线性方程的角度看的线性回归【1】
  7. CMake使用介绍(2)
  8. java 数据抓取 动态获得cookies里变动的属性_@CookieValue获取Cookie信息,使用Servlet API作为入参,处理模型数据...
  9. (九)企业分布式微服务云SpringCloud SpringBoot mybatis-服务链路追踪(Spring Cloud Sleuth)...
  10. 通知NSNotificationCenter
  11. Mybatis 常用开发注解(批量插入)
  12. 一个很方便使用十六进制的颜色值的宏
  13. Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you‘re try
  14. VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题
  15. 这一篇彻底说清楚了!乐高,编程,机器人到底要不要学?
  16. 【R语言】ggplot2:初次见面,请多多关照!
  17. Adobe Audition CC 2019 下载安装教程
  18. 科研写作——常见句式(十一)
  19. ParaView-1
  20. vl53l1x激光测距讲解

热门文章

  1. app每次更新版本时调用js代码提示用户下载更新
  2. Python文件格式 .py .pyc .pyw .pyo .pyd的主要区别
  3. java笔试之字符串反转
  4. 关于Mysql 修改密码的记录
  5. POJ 2485-Highways
  6. Nboot中nand flash控制器参数TACLS、TWRPH0和TWRPH1的确定(基于K9F1208U0B)
  7. JAVA-接口和抽象类的区别
  8. 【Python基础】字符编码ASCII-GBK-Unicode-UTF-8之间的关系
  9. [HDU 1427]速度计算24点(DFS暴力搜索)
  10. docker supervisor管理进程