java与模式 第四章 “开-闭”原则(OCP)

2010-01-10

4.1 什么是开闭原则"开-闭"原则

    “开-闭”原则讲的是:一个软件系统应该对开展时开放的,对修改时关闭的。英文原话:

    (Software entity should be open for extension, but closed for modification)

    这个原则说的是,在设计一个模块的时候,应该可以使这个模块可以在不被修改的前提下被扩张。换言之,应该可以在不必修改源代码的情况下改变这个模块的行为。

   听上去很矛盾,但是通过一些使用一些设计模式就可以轻松的做到,如 适配器模式(adapter)等等。

   满足了OCP(Open-Closed Principle)原则可以给软件系统带来两个无法比拟的设计目标:

  1.扩展性。通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求。

  2.稳定性。已有的软件模块,特别是最重要的抽象层模块不能被修改,这就是变化中的软件系统有一定的稳定性和可延续性。

 同时,又可以使系统的可维护性大大提高。

4.2怎么做到“开-闭”原则

   举个例子:

   中国有很多个省,在这里排除直辖市,每个省有管理很多城市。大概是这样的情况,中国管省,省管市。但是随着经济的发展,很多县城的经济发展很快,如苏州的的昆山,经济发展已经超越了很多城市,但是昆山市个县,昆山政府申请变为城市,但是国家又不想改变现有的城市编制和管理,于是县级市诞生了,昆山以县级市的身份展现在了全国人民心中。

    怎么才能实现“开-闭”原则

  抽象化是关键

解决问题的关键在于抽象化。在像java这样的面向对象的语言中,可以给系统定义出一个一劳永逸,

不再更改的抽象设计,此设计允许有无穷无尽的实现,并且互不影响。在java语言中,给出一个抽象的类或者

接口,规定出具体方法必须提供的方法特征作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,

因此,在任何扩展情况下都不会改变。这就使得系统的抽象层不需要修改,从而满足了“开-闭”原则的第二条

:对修改是关闭的。

同时,由于从抽象层导出一个或多个新的具体类来实现抽象类或者接口就可以改变系统的行为,因此系统的设计对扩展时开放的,

这就满足了“开-闭”原则的第一条。

对可变性的封装原则

如何设计好抽象层的类或者接口,我们必须对系统的可变性进行封装。这就是所谓的”对可变性的封装原则

"(Principle of Encapsulation of Variation short for EVP)对可变性的封装原则 讲的是找到一个系统的可变因素,将其封装起来。

“对可变性的封装原则”意味着两点:

1.一种可变性不应散落在很多角落,而应当被封装到一个对象里面。

2.一种可变性不应当与另一种可变性混合在一起。

相关推荐