open close principle
定义:软件实体(类、模块、函数等)应该可以扩展,但是不能修改。
这个定义包含两个特征:
-
对于扩展是开放的(open for extension)
-
对于更改是封闭的(close for modification)
开发人员应该仅对程序中出现频繁变化的那部分做出抽象。
开闭原则:基于接口或抽象实现“封闭”,基于实现接口或继承实现“开放”(拓展)。
争哥的第一个例子,AlertHandler为抽象,一般是固定不变的。 子类TpsAlertHandler为继承;
再看第二个例子,MessageQueue,MessageFormatter为接口,具体实现为KafkaMessageQueue和JsonMessageFormatter等。
public interface MessageQueue {
void put();
}
interface MessageFormatter {
void format();
}
class KafkaMessageQueue implements MessageQueue {
@Override
public void put() {
}
}
class RocketMessageQueue implements MessageQueue {
@Override
public void put() {
}
}
class JsonMessageFormatter implements MessageFormatter {
@Override
public void format() {
}
}
class Demo {
MessageQueue queue;
Demo(MessageQueue queue) {
this.queue = queue;
}
void setNotification(MessageFormatter formatter) {
formatter.format();
}
public static void main(String[] args) {
}
}
以后替换或者增加其他的AlertHandler和message queue很容易。
两个例子中的抽象类和接口是固定的(封闭),继承或实现是可扩展的。通过“抽象-具体”体现了开闭原则,增加了软件的可维护性。
开闭原则具体应用,需要慢慢积累经验。争哥也说了,首先需要有对业务深刻的理解。其次就是学习一些设计原则和模式了。
1、Bertrand Meyer 1988 年提出open-closed principle。 2、再推荐一篇经典文章 Robert C. Martin 2006年写的The Open-Closed Principle。不方便下载的话,我放到github上了:https://github.com/gdhucoder/Algorithms4/tree/master/designpattern/pdf