面向对象的五大设计原则之开放封闭原则

随着我们软件系统的规模不断的增大,软件系统的维护和修改的复杂性不断地增加,在这种情况下,法国工程院院士bertrand meyer在1998年提出了开放封闭原则(open close principle,简称OCP),它的基本思想就是,open(open for exception)模块的行为,必须是开放的,支持扩展的,而不是僵化的,close(close for modification)在对模块的功能进行扩展时,不能影响或者说不能大规模的影响已有的系统模块。

可以这么来说,开发封闭原则要求程序人员在不修改系统中已有的功能代码(源代码或者二进制代码)的前提下,实现对应用系统的软件功能的扩展,咱们用一句话概括就是,一个模块在扩展性方面应该是开放的,而在更改性方面,应该是封闭的。

我们生活中的例子可以拿电脑来比喻,我们可以轻松地扩展电脑的功能,只需要在接口插入不同的设备就好。

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

//定义播放器的抽象接口
interface process
{
    public function process();
}

class decode implements process
{
    
    public function process()
    {
        echo "decode";
    }
}

class output implements process
{
    
    public function process()
    {
        echo "output";
    }
}

class use_process
{
    private $msg=null;

    function __construct()
    {
        # code...
    }

    public function callback(event $event)
    {
        $this->msg = $event->click();
        if($this->msg instanceof process) {
            $this->msg->process();
        }
    }
}

class mp4
{
    
    public function work()
    {
        $u_p = new use_process();
        $u_p->callback(new event("decode"));
        $u_p->callback(new event("output"));
    }
}

class event
{
    private $me;
    function __construct($me)
    {
        $this->me = $me;
    }

    public function click()
    {
        switch ($this->me) {
            case 'decode':
                return new decode();
                break;
            case 'output':
                return new output();
                break;
        }
    }
}

$mp4 = new mp4();
$mp4->work();

接下来,我们来分析下上述代码,首先我们是定义了一个播放器的抽象接口process,之后呢,我们就需要对这个接口进行扩展了,让它有一个解码decode和输出output的功能,对于播放器的各种功能,在这里是开放的,只要我们遵守约定实现process接口,我们就可以任意的给播放器添加功能,接下来我们就要定义播放器的线程调度管理器use_process了,当播放器接到通知(可以是外部的点击click也可以是内部的notify),将会回调实际的线程来处理,之后呢,我们就要来定义个产品了mp4,这个类是相对封闭的,最后就是类似工厂模式的事件分拣处理类,这个类呢,负责对事务进行分拣,并且判断用户的内部行为,最后产生正确的线程,供播放器内置的县城管理器调度。

通过上述代码,我们实现了一个最基本的播放器,这个播放器的功能模块对外部是开放的,但是内部处理是相对稳定和封闭的,但是呢,还是有一些小瑕疵,有时候为了降低系统的复杂性,我们也不会完全的遵守设计模式,我们会对其进行修改。

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

来看下开放封闭原则的具体编程思想:

1、在设计方面充分应用抽象和封装的思想

一方面是要在软件系统中找出各种可能的可变因素,将之封装起来,另一方面,一种可变因素不应该散落在多个不同的代码块中,而应该被封装到一个对象中。

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

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

面向接口编程要求功能类实现接口中所有的方法,对象声明为接口的类型,在设计模式中,装饰模式明显的应用了开放封闭原则。

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值