- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP面向对象五大原则之开放-封闭原则(OCP)详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了PHP面向对象五大原则之开放-封闭原则(OCP)。分享给大家供大家参考,具体如下:
1. 什么是“开放-封闭” 。
随着软件系统规模的不断增大,软件系统的维护和修改的复杂性不断提高,这种困境促使法国工程院士Bertrand Meyer在1998年提出了“开放-封闭”(Open-Close Principle,OCP)原则,这条原则的基本思想是:
Open(Open for extendtion)模块的行为必须是开放的、支持扩展的,而不是僵化的.
Close(Closed for modification)在对模块的功能进行扩展时,不应该影响或大规模地影响已有的模块.
换句话说,也就是要求开发人员在不修改系统中现有代码(源代码或者二进制代码)的前提下,实现对应用系统的软件功能的扩展。用一句话概括就是:一个模块在扩展性方面应该是开发的而在更改性方面应该是封闭的.
从生活中,最容易想到的的例子就是电脑,我们可以轻松地对电脑进行功能的扩展,而只需通过接口连入不同的设备.
开放-封闭能够提高系统的可扩展性和可维护性,但这也是相对的,对于一台电脑不可能完全开放,有些设备和功能必须保持稳定才能减少维护上的困难。要实现一项新的功能,你就必须升级硬件,或者换一台更高性能的电脑。以电脑中的多媒体播放软件为例,作为一款播放器,应该具有一些基本的、通用的功能,如打开多媒体文件,停止播放、快进、音量调节等功能。但不论是什么播放器,不论是什么播放平台下,遵循这个原则设计的播放器都应具有统一风格和操作习惯,无论换用哪一款,都应保证作者能快速上手.
以播放器为例,先定义一个抽象的接口,代码如下所示.
然后,对此接口进行扩展,实现解码和输出功能,如下所示 。
对于播放器的各种功能,这里是开放的,只要你遵照约定,实现了process接口,就能给播放器添加新的功能模块。这里只实现解码和输出模块,还可以依据需求,加入更多新的模块.
接下来定义播放器的线程高调度管理器,播放器一旦接收到通知(可以是外部单击行为,也可以是内部的notify行为),将回调实际的线程处理,代码如下 。
具体的产品出来了,在这里定义一个MP4类,这个类是相对封闭的,其中定义事件的处理逻辑,代码如下 。
最后为事件分拣的处理类,此类负责对事件进行分拣,判断用户或内部行为,以产生正确的“线程”,供播放器内置的纯种管理器调度,代码如下 。
最后运行下而的代码 。
运行结果如下:
encode ouput 。
2. 如何遵守开放-封闭原则 。
实现开放-封闭的核心就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,这样的修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的.
1)在设计方面应用“抽象”和“封装”的思想.
一方面也就是要在软件系统中找出各种可能的“可变因素”,并将之封装起来.
另一方面,一种可变的因素不应当散落在多个不同代码模块中,而应当被封装到一个对象中.
2)在系统功能编程实现方面应用面向接口的编程.
当需求发生变化时,可以提供该接口新的实现类,以求适应变化.
面向接口编程要求功能类实现接口,对象声明为接口类型。在设计模式中,装饰模式比较明显地用到了OCP.
希望本文所述对大家PHP程序设计有所帮助.
最后此篇关于PHP面向对象五大原则之开放-封闭原则(OCP)详解的文章就讲到这里了,如果你想了解更多关于PHP面向对象五大原则之开放-封闭原则(OCP)详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有人查看我的代码说下面的 SQL 查询 (SELECT * FROM...) 显然容易受到攻击。我对此进行了研究,似乎我通过使用参数化查询正确地做到了这一点,但显然我遗漏了一些东西。 app.get(
我使用 Curie 作为基本模型,使用自定义数据集创建了一个微调模型。我正在使用 Azure OpenAI 服务。 该模型正在尝试使用最大可能的 token 生成响应。例如,如果 max_token
我正在尝试将6x15数组(映射)中的随机坐标设置为数字3,但前提是该坐标的值仍为0。我要放置的值为3) 25 int shipnum; 26 int x; 27 28 shipnum = 1;
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
您好,我正在寻找“开放”、“链接”和“多重哈希”算法的伪代码。是的,我花了很多时间在谷歌上搜索,但没能找到好东西。 如果你有分享的链接,我将不胜感激 问候 最佳答案 这hash table tutor
是否可以实现 Visitor Pattern尊重 Open/Closed Principle ,但仍然可以添加新的可访问类? 开放/封闭原则指出“软件实体(类、模块、函数等)应该对扩展开放,但对修改关
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 12 年前
我创建了 Azure 开放 AI 服务我想针对特定问题训练模型。但是,自定义模板按钮被禁用。在文档中,它说明了如何生成包含要训练的问题和答案的 .Jsonl,但没有任何内容可以导入这些文件。有人拿到了
我找到了一些关于开放/封闭递归的解释,但我不明白为什么定义中包含“递归”一词,或者它与动态/静态调度相比如何。我找到的解释中有: Open recursion. Another handy featu
我正在尝试为在加权图上运行的库找出类设计。可以在这个图上执行各种算法,例如,找到两个节点之间的最短距离,两个节点之间的最长距离,两个节点之间距离小于 10 的路径数(比方说)等。 我关心的不是我所知道
谁能告诉我开放 SSL 和安全 SSL 之间的区别。 我已经在 Play 商店发布了新的 Android 应用程序,它使用远程 API。 在 API 服务器上,我已经成功安装了安全 SSL。但我仍然被
当我将 url 加载到 WebView 并尝试打开链接时,其中一些会显示如下错误页面: net::ERR_UNKNOWN_URL_SCHEME intent://maps.yandex.ru?utm_
2 月 24 日消息 据外媒 TheVerge 报道,2 月 23 日晚间,LG 宣布将该公司的 webOS 智能电视平台授权给其他电视厂商使用,目前 LG 已和 RCA、Ayonz 和康佳等电视厂
我一直在思考这个面向对象的设计问题,但无法提出令人满意的解决方案,所以我想在这里向人群开放以征求意见。 我有一个代表回合制棋盘游戏的 Game 类,出于这个问题的目的,我们可以假设它类似于 Monop
我们有一个 Web 服务,它充当我们的客户和另一个服务之间的网关。客户端向第三方服务发送消息并从其接收随机消息。客户端的服务器通过安全套接字打开到我们的 Web 服务器的 channel ,以便接收传
应用商店里有一个叫 Touchpad 的应用,最后一次更新是在 11 月 29 日,其中包含一个新功能,支持“使用设备键盘上的 Siri 键向电脑发送文本”,我想知道是否有开放的 API Siri现在
我尝试在认知搜索上下文中为 Azure 开放 AI 服务添加矢量搜索时遇到问题。选择勾选标记后,即使有可用的现有文本嵌入模型,我也无法列出任何模型。造成这种差异的可能原因是什么以及如何解决? 最佳答案
我尝试在认知搜索上下文中为 Azure 开放 AI 服务添加矢量搜索时遇到问题。选择勾选标记后,即使有可用的现有文本嵌入模型,我也无法列出任何模型。造成这种差异的可能原因是什么以及如何解决? 最佳答案
我们的堆栈:Tomcat 7、Spring 3.1.1、OpenJPA 2.2.0 我遇到了一个问题,根源是比较: server1.equals(server2); server1 和 server2
我正在使用以下命令设置一个 java EE 项目(打开)JPA。我使用 glassfish 4.0 作为我的应用程序服务器,但似乎无法让持久性发挥作用。 我面临的问题似乎是一个相当普遍的问题,因为同一
我是一名优秀的程序员,十分优秀!