设计模式中的开放封闭原则

概念

  开放封闭原则(简称OCP,Open Closed Principle)是所有面向对象原则的核心。软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。其他的设计原则,很多时候是为实现这一目标服务的,
  关于开放封闭原则,其核心的思想是:
  软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

原则

主要体现在两个方面:
  对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
  对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
  “需求总是变化”、“世界上没有一个软件是不变的”,这些言论是对软件需求最经典的表白。从中透射出一个关键的意思就是,对于软件设计者来说,必须在不需要对原有的系统进行修改的情况下,实现灵活的系统扩展。而如何能做到这一点呢?
只有依赖于抽象。实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。让类依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。这是实施开放封闭原则的基本思路,同时这种机制是建立在两个基本的设计原则的基础上,这就是Liskov替换原则和合成/聚合复用原则。关于这两个原则,我们在本书的其他部分都有相应的论述,在应用反思部分将有深入的讨论。
  

举例说明

  如果银行业务需要增加其他的功能,比如转账业务,那么我们需要修改BankProcess类,违反了对于修改是封闭的

class BankProcess
    {
        //存款
        public void Depsite()
        {
            Console.WriteLine("存款业务");
        }

        //取款
        public void Withdraw()
        {
            Console.WriteLine("存款业务");
        }
    }

  那么我们怎来设计才能符合OCP原则呢?将业务功能抽象为接口,当业务依赖固定的抽象时,对修改那就是封闭的,而通过继承和多态 ,从抽象体中扩展出新的实现,就是对扩展的开放

 interface IBankProcess
    {
        void Process();
    }

  存款业务实现

  class DepsiteProcess : IBankProcess
    {
        public void Process()
        {
            Console.WriteLine("存款");
        }
    }

  取款业务实现

 class WithdrawProcess : IBankProcess
    {
        public void Process()
        {
            Console.WriteLine("取款");
        }
    }

  对于转账业务,我们进行扩展,这里我们就不要去修改原来已经有的代码了,只需要扩展一个新的业务类就可以了

class Transfer : IBankProcess
    {
        public void Process()
        {
            Console.WriteLine("转账");
        }
    }

规则建议

  l 开放封闭原则,是最为重要的设计原则,Liskov替换原则和合成/聚合复用原则为开放封闭原则的实现提供保证。

  l 可以通过Template Method模式和Strategy模式进行重构,实现对修改封闭、对扩展开放的设计思路。

  l 封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态一般将其封装为一个抽象,例如银行业务中的IBankProcess接口。

  l 拒绝滥用抽象,只将经常变化的部分进行抽象,这种经验可以从设计模式的学习与应用中获得。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值