软件设计原则-- 开放-封闭原则

开放-封闭原则(Open Close Principle,OCP)

软件规模的扩大,导致软件系统的维护难度上升。因此法国工程院院士Bertrand Meyer 提出了开放封闭原则。

什么是开放-封闭原则

此原则的基本思想是:
- Open ( Open for extension ) 对扩展开放,模块的行为是灵活的。
- Closed ( Closed for modification ) 对模块进行扩展的时候,不能影响已有的程序模块。

比较直观的例子就是电脑,我们可以很容易的对电脑进行硬件上的扩充,只需要在不同的接口上链接即可,而不会影响已有的功能。这就是开放-封闭原则。

那么,如何把这两个看似矛盾的特性结合起来呢?

要点是抽象类,或者接口

通过定义抽象类或者接口,我们可以规范一类型类的行为,使得调用者在使用这些被规范的类的时候可以使用同一的代码而调用而不用修改原来的代码。这样,我们就可以做到了开放-封闭原则。下面举一个例子。

我们手头有一台计算机,它的一切资源都由进程类来管理

class processManager {
    private $msg = null;

    public function __construct () {
    }

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

}


class computer {
    private $manager;

    public function __construct ( processManager $manager ) {
        $this->manager = $manager;
    }

    public function work () {
        $this->manager->callback ( new event ('displayCard') );
        $this->manager->callback ( new event ('keyboard') );
    }

}

class event {
    private $msg;
    public function __construct ( $m ) {
        $this->msg = $m;
    }
    public function click () {
        switch( $this->m ) {
            case 'displayCard':
                return new displayCard ();
                break;
            case 'keyboard':
                return new keyboard ();
                break;
        }
    }
}

下面是进程管理者所管理的进程

interface process {
    public function process (); } class displayCard implements process {
    public function process () {
        echo 'display';
    }
}


class keyboard implements process {
    public function process () {
        echo 'type word';
    }
}

上面只实现了显示卡和键盘两个功能,如果需要添加新功能只需要实现process接口即可,而不需要修改已经实现的接口。

其实,上面的代码逻辑就如同我们生活中组装电脑一般,当需要新的扩展功能的时候,只需要实现process接口并加入计算机类中就可以完成。

如何遵守开放-封闭原则

实现开放-封闭原则的中心思想就是面向抽象编程,而不对具体对象编程。

  • 设计方面充分应用抽象和封装,将可变因素封装起来,同时可变因素不应该散落在多个模块中
  • 在系统功能编程的时候应该面向接口编程。当需求发生变化的时候,我们只需要提供该接口新的实现类即可。在设计模式中,装饰模式应用了开放-封闭原则。

你可能感兴趣的:(软件设计)