OCP

Page content

[TOC]

Brief introduction about OCP.

开闭原则 OCP

定义

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