源码分析七大设计原则之开闭原则(Open Close Principle)
2021/12/14 12:16:50
本文主要是介绍源码分析七大设计原则之开闭原则(Open Close Principle),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
源码分析之七大设计原则
一、开闭原则(Open Close Principle)
定义:软件实体应当对扩展开放,对修改关闭,即:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等,应该在不修改现有代码的基础上,去扩展新功能
开闭原则中的 开,是指对于组件功能的扩展是开放的,允许对其进行功能扩展的;开闭原则中的 闭,是指对于代码的修改是封闭的,即不应该修改原有的代码
二、源码演练
反例代码,问题:每增加一种图形,就需要修改 GraphicEditor 类。这样就违背了对扩展开放,对修改关闭
/** * Shape 类,基类 */ class Shape { int m_type; } /** * 矩形 */ class Rectangle extends Shape { public Rectangle() { super.m_type = 1; } } /** * 圆 */ class Circle extends Shape { public Circle() { super.m_type = 2; } }
/** * 这是一个用于绘图的类 */ class GraphicEditor { // 接收 Shape 对象,然后根据 type,来绘制不同的图形 public void drawShape(Shape s) { if (s.m_type == 1) { drawRectangle(s); } else if (s.m_type == 2) { drawCircle(s); } } public void drawRectangle(Shape r) { System.out.println(" 绘制矩形 "); } public void drawCircle(Shape r) { System.out.println(" 绘制圆形 "); } }
public class Client { public static void main(String[] args) { GraphicEditor graphicEditor = new GraphicEditor(); graphicEditor.drawShape(new Rectangle()); graphicEditor.drawShape(new Circle()); } }
修改后的代码
class GraphicEditor { // 接收Shape对象,然后根据type,来绘制不同的图形 public void drawShape(Shape s) { s.draw(); // 图形里面直接提供绘画方法 } } abstract class Shape { public abstract void draw(); } class Rectangle extends Shape { @Override public void draw() { System.out.println("绘制矩形 "); } } class Circle extends Shape { @Override public void draw() { System.out.println("绘制圆形"); } }
开闭原则的最终解决方案是面向接口编程。开闭原则是最基础的设计原则,其他设计原则都是开闭原则的具体形态,它是面向对象设计的终极目标
这篇关于源码分析七大设计原则之开闭原则(Open Close Principle)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享