SofeWare entities (classes,modules,function,etc.) should be open forextension but closed for modification.
1如果一个功能的改动会级联式的引发其他模块的改动,则不符合开闭原则。反之如果可以仅通过增加代码而不是修改代码来实现功能的迭代,扩展则该程序符合开闭原则。
2如何实现在不改动原代码的情况下扩展新的功能呢?答案就是抽象,如下图,如果两个类都是具体的类,当客户想换一个服务对象的时候,就不得不改动Client类。
正确是实现方式应该是根据在客户类和服务类之间加一个接口,利用策略模式来实现服务类的替换,客户要更换新的服务类时,只需要创建一个新的服务类继承服务接口,而客户类则可以不用改动代码
图1
、
图2 遵循开闭原则的设计
同时遵循开闭原则的设计模式除了策略模式还有模板方法模式