博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OCP开放封闭原则
阅读量:6991 次
发布时间:2019-06-27

本文共 1009 字,大约阅读时间需要 3 分钟。

一、定义

  软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。

  如果正确的应用了OCP原则,那么 以后在进行同样的改动时,就只需要添加新的代码,不必修改已经正常运行的代码。

二、OCP概述

  1.对于扩展是开放的

  这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。换句话说,我们可以改变模块的功能。

  2.对于修改是封闭的

  对模块进行扩展时,不必改动模块的源代码或者二进制代码。

  3.有何问题

  这两个特征好像是互相矛盾的。扩展模块行为的通常方式就是修改该模块的源代码。不允许修改模块常常都认为具有固定的行为。

  4.如何实现?(抽象)

  怎么可能在不改动源代码的情况下去更改它的行为呢?如果不更改一个模块,又怎么能够去改变它的功能呢?

  答案是抽象。在C#中,可以创建出固定却能够描述一组任意个可能行为的抽象体。这个抽象体就是抽象基类。而这一组任意个可能的行为则表现为可能的派生类。

  模块可能对抽象体进行操作。由于模块依赖于一个固定的抽象体,所以它对于更改可以是封闭的。同时,通过从这个抽象体派生,可以扩展此模块的行为。

  下图展示了一个简单的不遵循OCP的设计。Client类和Server类都是具体类。Client类使用Server类,如果我们希望Client对象使用另一个不同的服务器对象,那么就必须要把Client类中使用Server类的地方更改为新的服务器类。

   

  下图则使用Strategy模式(策略模式)展示了一个针对上述问题的遵循OCP的设计。

  

  下图展示了另一个使用Template method模式(模版方法模式)的结构。

  

  和图2中Client类的函数类似,Policy类具有一组实现了某个策略的具体公共函数。和前面一样,这些策略函数根据一些抽象接口描绘了要完成的功能,不同的是,在这个结构中,这些抽象接口是Policy类本身的一部分。在C#中,它们是抽象方法。这些函数在Policy类子类型中实现。这样,可以通过从policy类派生出新类的方式,对Policy中指定的行为进行扩展。

三、结论

  在很多方面,OCP都是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处:灵活性、可重用性以及可维护性。

  拒绝不成熟的抽象和抽象本身一样重要。

转载地址:http://bzbvl.baihongyu.com/

你可能感兴趣的文章
如何从互联网获取Puppet的各项特殊资源
查看>>
Smack知识知多少
查看>>
Amazon Workspace DaaS服务快速导读
查看>>
修改LigerUI的导航栏,改为Tab标签模式
查看>>
VMware View 与Citrix XenDesktop 用户体验大比拼-iPad篇
查看>>
Windows 10 TH2改进
查看>>
虚拟桌面的备份恢复最佳实践 第一部分
查看>>
视频营销,带来SKYCC组合营销软件火爆热销?
查看>>
SuperMap IS.NET不出图的常见问题
查看>>
闲聊Redis
查看>>
flex 学习总结
查看>>
Windows Phone 7 ManipulationStarted 事件
查看>>
解决ubuntu下软件包没有完整安装导致新立得无法打开
查看>>
配置GDB以支持查看stl容器数据
查看>>
Sql Server2005 Transact-SQL 新兵器学习总结之-TRY…CATCH
查看>>
WPF中MVVM模式原理分析与实践(转)
查看>>
javascript控制不同行不同颜色
查看>>
软件工程 软件的估计为什么这么难
查看>>
“如何有效沟通”培训小结
查看>>
[原创].串行ADC TLC549读取实验,Verilog版本
查看>>