设计模式原则:开放封闭原则
开闭原则,顾名思义,对扩展开放,对修改封闭。在谈细一点,对什么扩展开放?对什么修改封闭?
还是用经典的Client和Server举例吧。客户端使用服务器,或者叫使用服务器提供的服务。在左边的图,客户端直接依赖于服务。这会造成,一旦由另一个提供程序服务,则客户端也需要修改。当增加了Client Interface后,这个系统对增加另一种服务是开放的,对修改原有的调用代码是封闭的。Client不需要修改,就能使用新的服务。
我这样理解:对新服务的扩展开发,对原有使用服务的业务代码修改是封闭的。
实际上我们发现,开闭原则和依赖倒置原则追求的结果是完全一样的,所有类都去依赖于抽象类。只是角度,不一样,依赖倒置原则是从这样的角度谈得,通常习惯性设计是高层依赖低层,现在变为低层依赖高层定义的接口。而开闭原则谈的是,加入抽象类,低层便于扩展,高层代码可以保持不变。
在代码中是如何实现Server变化,而不用改变Client呢?
定义一个接口
- interface IClient{
- public String action();
- }
定义多个服务类实现该接口。定义客户类,接口类作为客户类函数的参数。实例化服务类和客户类,把不同的服务类作为客户类的函数参数。
-
class Server1 implements IClient{ -
public String action(){ -
return “I’m
server 1 to provide service”; -
} -
} -
class Server2 implements IClient{ -
public String action(){ -
return “I’m
server 2 to provide service“; -
} -
} -
-
class Client{ -
public void do(IClient clientInf){ -
System.out.println(”Start to call server”); -
System.out.println(clientInf.action()); -
} -
} -
-
void main(String[] args){ -
Client client= new Client(); -
client.do(new Server1()); -
client.do(new Server2()); -
}
有人可能会疑惑,为什么接口类不叫AbstractServer呢?它就是众多server的抽象类呀。是可以叫AbstractServer。这里叫ClientInterface主要表达这个接口类的行为应该根据Client如何调用Server来定义,而不是根据众多server类抽象出来看能提供多少服务。记住,底层是由于上层的需要而存在的,上层不需要的服务是那么底层是不用提供的。