什么是开闭原则?
一个软件实体应该对扩展开放,对修改关闭。这个原则说的是在设计一个模块时,应当使这个模块可以在不被修改的前提下被扩展。
满足开闭原则的应用的优势:
1.通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件有一定的适应性和灵活性。
2.已有的软件模块,特别是最重要的抽象层模块不能被修改,这就使变化中的软件系统有一定的稳定性和延续性。
这就使得系统有高层级的复用和易于维护。
怎么做到开闭原则?
1.抽象化是关键
对于java这种面向对象的语言来讲,可以给系统定义一个一劳永逸、不再更改的抽象设计,此设计允许有无穷无尽的行为在实现层被实现。比如抽象类、或者接口,规定出所有实现类必须提供的方法的特征作为系统设计的抽象层。这个抽象层预见了所有可能的扩展,因此在任何情况下都不会改变。这就使得系统的抽象层不被修改,从而满足开闭原则的第二条:对修改关闭。
示例:
long topicTotal(Query query);
在接口层定义查询话题总数的接口,接口的入參是Query对象,这样所有的查询话题总数都可以调用该接口,给不同的查询条件,查询不同条件的话题总数。如下接口中的修改方法同理:
boolean updateTopic(String topicId, Update update);
2.对可变性的封装原则
(1) 一种可变性,不应当散落在代码的很多角落里,而应当被封装在一个对象里面。
示例1如下枚举:
public enum UserPlatform {
APP {//有效
public String getValue() {
return "app";
}
},
WEB {//无效
public String getValue() {
return "web";
}
};
public abstract String getValue();
}
如图可见,用户平台氛围app、web,可能后续会有pc应用,那么只需要扩展该枚举添加一个pc应用,这样来维护系统的可变性。
例如工厂模式中添加判断条件来扩展新的创建,不动原有逻辑,对代码进行扩展完成新的对象的创建。
ps:从开闭原则可以看出面向对象的重要原则就是创建抽象化,并从抽象化导出具体化。具体化可以给出不同版本,每一个版本都能给出不同的实现。