当前位置: 首页 > news >正文

Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)

开闭原则

    • 3.1开闭原则
      • 3.1.1 概述
      • 3.1.2 案例

3.1开闭原则

开闭原则:Open Close Principle,OCP

3.1.1 概述

对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。

3.1.2 案例

如下,分析搜狗输入法皮肤设计:
分析:搜狗输入法的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根绝自己的喜爱更换不同的输入法皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以将这些共同的的特点抽取到一个抽象类(AbstractSkin)中,而每个具体的皮肤(DefaultSkin、MySkin)是其子类。用户可以根据需要选择或者增加新的主题,而不需要修改原代码。

在这里插入图片描述

// 抽象类
public abstract class AbstractSkin {public abstract void displaySkin();
}
=========================================================//实现类public class DefaultSkin extends AbstractSkin{@Overridepublic void displaySkin() {System.out.println("这是默认皮肤...");}
}
=========================================================//实现类public class MySkin extends AbstractSkin{@Overridepublic void displaySkin() {System.out.println("这是自己的皮肤...");}
}
=========================================================/*** 实现聚合的类*/
public class SouGouInput {//成员变量是AbstractSkin类型,(实现聚合)private AbstractSkin skin;public void setSkin(AbstractSkin skin) {this.skin = skin;}//普通方法public void display(){//根据设置(setXxx)的成员变量的不同,来调用不同成员变量的皮肤//这里的成员变量类型是抽象类型,//所以是根据传递不同实现类的对象而调用不同的实现类里重写后的方法来显示不同的皮肤skin.displaySkin();}
}
=========================================================
//测试类public class ClinentTest {public static void main(String[] args) {//1. 创建搜狗输入法对象,将各种皮肤聚合到一起SouGouInput sgi = new SouGouInput();// 2.创建皮肤对象//2.1 常规// DefaultSkin ds = new DefaultSkin();// 2.2多态AbstractSkin ds = new DefaultSkin();MySkin ms = new MySkin();// 3.将皮肤设置到输入法中sgi.setSkin(ds);// sgi.setSkin(ms);// 4.显示皮肤sgi.display();//这是默认皮肤...//当有新的输入法皮肤时候,只需重新创建一个皮肤类去继承抽象类,
//然后重写里面的抽象方法,再在测试类中添加即可。而不用修改之前的代码}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • re题(27)BUUFCTF-[MRCTF2020]Transform
  • C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
  • 如何快速解决程序中的BUG
  • 商淘云九周年 分账系统助力企业合规发展
  • 深度学习数据集交通类常见图像分类、目标检测、分割图像数据集(深度学习数据集 - 交通类解决方案)
  • PHP环境搭建详细教程
  • 中秋献礼!2024年中科院一区极光优化算法+分解对比!VMD-PLO-Transformer-LSTM多变量时间序列光伏功率预测
  • 2021 年 6 月青少年软编等考 C 语言二级真题解析
  • QT Mode/View之View
  • 【webpack4系列】编写可维护的webpack构建配置(四)
  • Ubuntu 安装包下载(以20版本 阿里镜像站为例子)
  • Spring Boot-静态资源管理问题
  • Windows环境本地部署Oracle 19c及卸载实操手册
  • Vue3项目打包报错-内存溢出解决方法
  • vmvare如何给centos7 设置静态IP地址
  • 【Leetcode】101. 对称二叉树
  • 【个人向】《HTTP图解》阅后小结
  • 2017 年终总结 —— 在路上
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • HTML中设置input等文本框为不可操作
  • Joomla 2.x, 3.x useful code cheatsheet
  • js 实现textarea输入字数提示
  • MySQL几个简单SQL的优化
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python socket服务器端、客户端传送信息
  • windows-nginx-https-本地配置
  • 订阅Forge Viewer所有的事件
  • 浮现式设计
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • Hibernate主键生成策略及选择
  • raise 与 raise ... from 的区别
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​iOS安全加固方法及实现
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​数据结构之初始二叉树(3)
  • ‌JavaScript 数据类型转换
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (3) cmake编译多个cpp文件
  • (C语言)逆序输出字符串
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • ***原理与防范
  • .NET BackgroundWorker
  • .net core 连接数据库,通过数据库生成Modell
  • .Net FrameWork总结
  • .Net Redis的秒杀Dome和异步执行
  • .net 按比例显示图片的缩略图
  • .net 反编译_.net反编译的相关问题
  • .NET 中 GetProcess 相关方法的性能
  • .NET面试题(二)
  • @Controller和@RestController的区别?
  • [Android]使用Android打包Unity工程