OCP中的开放指的是对扩展性的开放,封闭指的是对修改的封闭。
实现OCP的一个重中之重就是:使用抽象接口,而非面向实例编程,从所有Server类中抽象出一个共同的AbstractServer类,它包含对所有Server类都共用的代码,当需要创建新的Server类型时,只需要从AbstractServer继承派生出具体子类。
这样做的好处是:在以后要新增功能的时候,不用修改原先类内部的代码,只需从抽象接口/抽象类派生出新的具体的子类。
举个例子:
一个银行的员工支持如下行为:Save()、Draw()、Transfer()。
违反OCP原则的做法是:设计一个BankWorker,内部有Save()、Draw()、Transfer()三种操作。如此一来,当我们需要新增一个功能:loan()的时候,就必须修改原先的BankWorker类。
而符合OCP原则的做法是:设计一个抽象接口BankWorker,它内部只有一个抽象操作:
operation()
描述员工的三种行为的时候,就根据接口实现三种实例SaveBankWorker、DrawBankWorker、TransferBankWorker,内部分别对operation()进行重写。当新出现功能loan()时,就只要添加一个新的实例LoanBankWorker即可,并不需要对原先的代码做出复杂繁琐的修改。