如何理解开放封闭原则?

开闭原则,顾名思义,对扩展开放,对修改封闭。在谈细一点,对什么扩展开放?对什么修改封闭?


还是用经典的Client和Server举例吧。客户端使用服务器,或者叫使用服务器提供的服务。在左边的图,客户端直接依赖于服务。这会造成,一旦由另一个提供程序服务,则客户端也需要修改。当增加了Client Interface后,这个系统对增加另一种服务是开放的,对修改原有的调用代码是封闭的。Client不需要修改,就能使用新的服务。

我这样理解:对新服务的扩展开发,对原有使用服务的业务代码修改是封闭的。


实际上我们发现,开闭原则和依赖倒置原则追求的结果是完全一样的,所有类都去依赖于抽象类。只是角度,不一样,依赖倒置原则是从这样的角度谈得,通常习惯性设计是高层依赖低层,现在变为低层依赖高层定义的接口。而开闭原则谈的是,加入抽象类,低层便于扩展,高层代码可以保持不变。




在代码中是如何实现Server变化,而不用改变Client呢?

定义一个接口

  1. interface IClient{  
  2.     public String action();  
  3. }
定义多个服务类实现该接口。定义客户类,接口类作为客户类函数的参数。实例化服务类和客户类,把不同的服务类作为客户类的函数参数。

  1. class Server1 implements IClient{  
  2.     public String action(){  
  3.         return "I'm server 1 to provide service";  
  4.     }  
  5. }  
  6. class Server2 implements IClient{  
  7.     public String action(){  
  8.         return "I'm server 2 to provide service";  
  9.     }  
  10. }  
  11.   
  12. class Client{  
  13.     public void do(IClient clientInf){  
  14.         System.out.println("Start to call server");  
  15.         System.out.println(clientInf.action());  
  16.     }  
  17. }  
  18.   
  19. void main(String[] args){  
  20.         Client client= new Client();  
  21.         client.do(new Server1());  
  22.         client.do(new Server2());  
  23. }  

有人可能会疑惑,为什么接口类不叫AbstractServer呢?它就是众多server的抽象类呀。是可以叫AbstractServer。这里叫ClientInterface主要表达这个接口类的行为应该根据Client如何调用Server来定义,而不是根据众多server类抽象出来看能提供多少服务。记住,底层是由于上层的需要而存在的,上层不需要的服务是那么底层是不用提供的。

SOLID 五项原则介绍

 如何理解单一职责原则?

 如何理解接口隔离原则?

 如何理解开放封闭原则?

 如何理解里氏替换原则?

 如何理解依赖倒置原则?


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值