前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP面向对象五大原则之开放-封闭原则(OCP)详解

PHP面向对象五大原则之开放-封闭原则(OCP)详解

作者头像
猿哥
发布于 2019-07-25 15:08:22
发布于 2019-07-25 15:08:22
65000
代码可运行
举报
文章被收录于专栏:Web技术布道师Web技术布道师
运行总次数:0
代码可运行

本文实例讲述了PHP面向对象五大原则之开放-封闭原则(OCP)。分享给大家供大家参考,具体如下:

  1. 什么是“开放-封闭”

随着软件系统规模的不断增大,软件系统的维护和修改的复杂性不断提高,这种困境促使法国工程院士Bertrand Meyer在1998年提出了“开放-封闭”(Open-Close Principle,OCP)原则,这条原则的基本思想是:

Open(Open for extendtion)模块的行为必须是开放的、支持扩展的,而不是僵化的。

Close(Closed for modification)在对模块的功能进行扩展时,不应该影响或大规模地影响已有的模块。

换句话说,也就是要求开发人员在不修改系统中现有代码(源代码或者二进制代码)的前提下,实现对应用系统的软件功能的扩展。用一句话概括就是:一个模块在扩展性方面应该是开发的而在更改性方面应该是封闭的。

从生活中,最容易想到的的例子就是电脑,我们可以轻松地对电脑进行功能的扩展,而只需通过接口连入不同的设备。

开放-封闭能够提高系统的可扩展性和可维护性,但这也是相对的,对于一台电脑不可能完全开放,有些设备和功能必须保持稳定才能减少维护上的困难。要实现一项新的功能,你就必须升级硬件,或者换一台更高性能的电脑。以电脑中的多媒体播放软件为例,作为一款播放器,应该具有一些基本的、通用的功能,如打开多媒体文件,停止播放、快进、音量调节等功能。但不论是什么播放器,不论是什么播放平台下,遵循这个原则设计的播放器都应具有统一风格和操作习惯,无论换用哪一款,都应保证作者能快速上手。

以播放器为例,先定义一个抽象的接口,代码如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface process{  public function process();}

然后,对此接口进行扩展,实现解码和输出功能,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class playerencode implements process{  public function process()  {    echo "encode",PHP_EOL;  }}class playeroutput implements process{  public function process()  {    echo "ouput",PHP_EOL;  }}

对于播放器的各种功能,这里是开放的,只要你遵照约定,实现了process接口,就能给播放器添加新的功能模块。这里只实现解码和输出模块,还可以依据需求,加入更多新的模块。

接下来定义播放器的线程高调度管理器,播放器一旦接收到通知(可以是外部单击行为,也可以是内部的notify行为),将回调实际的线程处理,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class playProcess{  private $message = null;  public function __construct() {}  public function callback(event $event)  {    $this->message = $event->click();    if($this->message instanceof process)    {      $this->message->process();    }  }}

具体的产品出来了,在这里定义一个MP4类,这个类是相对封闭的,其中定义事件的处理逻辑,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class mp4{  public function work()  {    $playProcess = new playProcess();    $playProcess->callback(new event('encode'));    $playProcess->callback(new event('output'));  }}

最后为事件分拣的处理类,此类负责对事件进行分拣,判断用户或内部行为,以产生正确的“线程”,供播放器内置的纯种管理器调度,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class event{  private $m;  public function __construct($me)  {    $this->m = $me;  }  public function click()  {    switch($this->m)    {      case 'encode';        return new playerencode();        break;      case 'output':        return new playeroutput();        break;    }  }}

最后运行下而的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$mp4 = new mp4;$mp4->work();

运行结果如下:

encode ouput

  1. 如何遵守开放-封闭原则

实现开放-封闭的核心就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,这样的修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。

1)在设计方面应用“抽象”和“封装”的思想。

一方面也就是要在软件系统中找出各种可能的“可变因素”,并将之封装起来。

另一方面,一种可变的因素不应当散落在多个不同代码模块中,而应当被封装到一个对象中。

2)在系统功能编程实现方面应用面向接口的编程。

当需求发生变化时,可以提供该接口新的实现类,以求适应变化。

面向接口编程要求功能类实现接口,对象声明为接口类型。在设计模式中,装饰模式比较明显地用到了OCP。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP面向对象五大原则之开放-封闭原则(OCP)详解
本文实例讲述了PHP面向对象五大原则之开放-封闭原则(OCP)。分享给大家供大家参考,具体如下:
用户8660814
2021/07/13
4090
PHP面向对象五大原则之接口隔离原则(ISP)详解
本文实例讲述了PHP面向对象五大原则之接口隔离原则(ISP)。分享给大家供大家参考,具体如下:
猿哥
2019/07/25
6340
PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则
单一职责有两个含义:一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多的职责。
lilugirl
2019/05/26
3680
面向对象设计五大原则
面向对象设计(Object-Oriented Design, OOD)和面向领域设计(Domain-Driven Design, DDD)是两种不同的设计方法论:
二锅头一桶天下
2024/08/31
1380
设计模式-6大原则
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力。
ronixiao
2022/07/25
4940
设计模式学习--面向对象的5条设计原则之开放封闭原则--OCP
一、OCP简介(OCP--Open-Closed Principle): Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification。 软件实体应当对扩展开放,对修改关闭,即软件实体应当在不修改(在.Net当中可能通过代理模式来达到这个目的)的前提下扩展。 Open for extension:当新需求出现的时候,可以通过扩展现有模型达到目的。 C
hbbliyong
2018/03/05
7560
面象对象设计6大原则之二:开放封闭原则
开放封闭原则(OCP),The Open Closed Principle 定义 一个软件的实体,包括类、方法、模块、应该对扩展开放,对修改关闭。 也就是说一个软件的实体应该通过扩展的方式来修改变化,而不是修改已有实体源代码。 开放封闭原则也是最基本需要遵守的原则,我们应该尽量保证系统的稳定性,我们在实现另外一个功能的时候不能修改之前已有的代码以免造成之前的功能出现BUG,带来不必要的麻烦,所以开放封闭原则正是引导我们去设计一个稳定、方便扩展的系统。 在实际应用中我们一般会有以下几种做法保证开放封闭原
Java技术栈
2018/03/30
5430
程序设计五大原则
单一职责原则SRP 功能结构单一,封装内不会出现不同功能的实现混在一起,耦合低,方便组合不同的功能,生成新的类封装 开放封闭原则OCP 扩展模块不能修改原有代码,而是应该扩展新的方法,保证代码的稳定性 里氏替换原则LSP 多态的一个描述,使用子类实现,使用基类替换 依赖倒置原则DIP 高层不能依赖低层,抽象不能依赖抽象 接口隔离原则ISP 多个专门业务的接口比单一接口好,特定的接口胜过通用的接口 参考:https://blog.csdn.net/u014117094/article/details
sofu456
2021/11/18
1860
PHP面向对象五大原则之单一职责原则(SRP)详解
本文实例讲述了PHP面向对象五大原则之单一职责原则(SRP)。分享给大家供大家参考,具体如下:
用户8660814
2021/07/13
4080
PHP面向对象五大原则之单一职责原则(SRP)详解
本文实例讲述了PHP面向对象五大原则之单一职责原则(SRP)。分享给大家供大家参考,具体如下:
猿哥
2019/07/25
5660
PHP面向对象——三大基本特性与五大基本原则
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
猿哥
2019/07/25
5890
设计模式原则(单一、开放封闭、里氏代换、依赖倒转、迪米特法则五大原则)
        如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,当变化发生时,设计会遭受到意想不到的破坏。事实上,我们完全可以找出来进行分类,分离。
aehyok
2018/09/11
1.1K0
java面向对象三大特征及五大原则
目的:增强数据安全性,不能让其他用户随意访问和修改数据,简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员
全栈程序员站长
2022/09/19
3120
面向对象设计的五大原则 —— 接口隔离原则
设计应用程序的时候,如果一个模块包含多个子模块,那么我们应该小心对该模块做出抽象。设想该模块由一个类实现,我们可以把系统抽象成一个接口。但是在需要添加新模块或者拓展功能时,新模块只包含原系统中的某一些子模块,那么系统就会强制我们实现接口中所以的方法,包括一些不需要的方法。这样一来,这些行为可能就会导致接口代码臃肿,冗余,导致资源的浪费。
PHP开发工程师
2021/04/29
3660
PHP面向对象五大原则之里氏替换原则(LSP)详解
本文实例讲述了PHP面向对象五大原则之里氏替换原则(LSP)。分享给大家供大家参考,具体如下:
用户8660814
2021/07/13
6790
面向对象五大设计原则
单一职责原则(Single Responsibility Principle,SRP),就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受意想不到的破坏。
卡尔曼和玻尔兹曼谁曼
2019/01/25
5470
设计模式之6大原则(6)开闭原则
开闭原则(OCP) 是 面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之中的一个,其他非常多的设计原则都是实现开闭原则的一种手段。
全栈程序员站长
2022/07/09
4820
JavaScript设计模式经典-面向对象中六大原则
主要学习JavaScript中的六大原则。那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则(LSP),依赖倒置原则(DIP),接口分离原则(ISP),最少知识原则(LKP)。
达达前端
2019/11/21
8320
JavaScript设计模式经典-面向对象中六大原则
面向对象六大原则----imageLoader为例层层优化
https://github.com/libin7278/ImageLoaderCourse.git
先知先觉
2019/01/21
4290
面向对象的三大基本特性,五大基本原则
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/54582323
大黄大黄大黄
2018/09/14
5940
推荐阅读
相关推荐
PHP面向对象五大原则之开放-封闭原则(OCP)详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验