开放-封闭原则的具体内容是“软件实体应该是可以扩展的,但是不可修改”。这其实也就是对可变性的封装原则。遵守改原则一方面要找出个汇总可能的可变因素,并将它们封装起来; 另一方面在具体功能实现的编程中,一种可变性因素不应当散落在许多不同代码模块中。可以用面向接口编程好额模板方法模式编程满足开放-封闭原则。
不满足开放封闭原则的设计如下:
- public class SomeFunctionRequest {
- SomeFunctionImple oneSomeFunctionImple ;
- public void doSomeFuction(){
- oneSomeFunctionImple.executeSomeService();
- }
- }
- public class SomeFunctionImple {
- public void executeSomeService(){
- }
- }
满足开放面向接口编程实现的设计:
- <pre name="code" class="java">
- public class SomeFunctionRequest {
- SomeFunctionInterface oneSomeFunctionImple = null;
- public SomeFunctionRequest(SomeFunctionInterface some) {
- this.oneSomeFunctionImple = some;
- }
- public void doSomeFuction() {
- oneSomeFunctionImple.executeSomeService();
- }
- }
- public class SomeFunctionImple implements SomeFunctionInterface {
- public void executeSomeService() {// 实现该接口
- }
- }
- public interface SomeFunctionInterface {
- void executeSomeService();
- }
单一职责原则:要求应用系统汇总的一个具体设计元素(类)之完成某一类功能(职责);尽可能避免出现一个复合功能的类(在同一个类中完成多个不同的功能)。这样可以减少类之间的耦合关系,能合理的进行类的职责分配。
Liskov替换原则(The Liskov Subsitution Principle, LSP):子类型必须能够替换他们的父类型,即基类型。遵守这个原则的基本要求是派生类要与其父类相容,也就是父类中的抽象方法都要在子类中实现,并且一个具体的实现类应当之实现器接口和抽象类的方法,而不应当给出多余的方法定义。其应用如下:在数据库的设计中,如果Oracle数据库要换成Mysql数据库,那么如果没有用抽象类或者接口编程,则会要改动大部分代码,如果用了面向接口编程则会只添加一个类即可。如图所示:
这样能使细节依赖于抽象。
接口隔离原则:这原则其实是单一职责原则应用于接口设计的的自然结果,其主要思想的体现之一是:一个类对另外一个类的依赖关系影单时间里在最小接口上的,其次体现为:使用多个专门的接口比使用单一的复合总接口要优越。
下图是不良的接口设计,将UserManage和BBSInfoManage接口复合。
改进后的接口设计,为单一接口。
依赖倒置原则:指应用系统中的高层模块不应依赖于底层模块,两者都应该依赖于抽象;抽象不应该依赖于细节实现,实现细节应该依赖于抽象。为了是应用系统中的个各类在设计时能够依赖于抽象而不依赖与具体的实现,开发者应该针对接口编程实现,而不应该针对具体的实现类编程。
为什么针对接口编程能够很好的满足依赖倒置原则,主要有两个原因:1)因为抽象是相对稳定的或者是相对变化不频繁的,而具体是容易变化的。2)依赖抽象是在应用系统中实现代码扩展和运行期内绑定(多态)的基础。