设计模式原则:开放封闭原则

设计模式原则:开放封闭原则

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


还是用经典的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类抽象出来看能提供多少服务。记住,底层是由于上层的需要而存在的,上层不需要的服务是那么底层是不用提供的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值