OpenClosedPrinciple - marmot-cn/marmot-framework GitHub Wiki

开放封闭原则(OCP)

概述

  • 实体应该对扩展开放,对修改封闭。即可扩展,不可修改
  • 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况;
  • 对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

示例

当用户在支付订单时,原来只支持微信支付,新的需求希望让用户可以有多种支付方式选择,比如可以选择支付宝支付或银联支付。对此,我们可以对支付方式进行抽象:

  • 微信支付
  • 支付宝支付
  • 银联支付
class Order
{
    public function pay(IPayMode $payMode) : bool
    {
        return $payMode->pay();
    }
}

interface IPayMode
{
    public function pay() : bool;
}

class WeChatPayMode implements IPayMode
{
    public function pay() : bool
    {
        # code...
    }
}

class AliPayMode implements IPayMode
{
    public function pay() : bool
    {
        # code...
    }
}

class UnionPayMode implements IPayMode
{
    public function pay() : bool
    {
        # code...
    }
}