open close principle
定义:软件实体(类、模块、函数等)应该可以扩展,但是不能修改。
这个定义包含两个特征:
对于扩展是开放的(open for extension)
对于更改是封闭的(close for modification)
开发人员应该仅对程序中出现频繁变化的那部分做出抽象。
开闭原则:基于接口或抽象实现“封闭”,基于实现接口或继承实现“开放”(拓展)。
争哥的第一个例子,AlertHandler为抽象,一般是固定不变的。 子类TpsAlertHandler为继承;
再看第二个例子,MessageQueue,MessageFormatter为接口,具体实现为KafkaMessageQueue和JsonMessageFormatter等。
publicinterfaceMessageQueue {
voidput();
}
interfaceMessageFormatter {
voidformat();
}
classKafkaMessageQueueimplementsMessageQueue {
@Overridepublicvoidput() {
}
}
classRocketMessageQueueimplementsMessageQueue {
@Overridepublicvoidput() {
}
}
classJsonMessageFormatterimplementsMessageFormatter {
@Overridepublicvoidformat() {
}
}
classDemo {
MessageQueuequeue;
Demo(MessageQueuequeue) {
this.queue = queue;
}
voidsetNotification(MessageFormatterformatter) {
formatter.format();
}
publicstaticvoidmain(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