文章来源:http://www.zretc.com/technologyDetail/477.html
软件开发中经常需要注意的原则有哪些呢?开闭原则就是其中之一
“开闭原则“图示如下:
让我来解释一下,设计规则如下:
“软件实体(类,模块,函数等)应该对扩展开放,对修改关闭。”
这意味着在最基本的层面上,你可以扩展一个类的行为,而无需修改。这就像我能够穿上衣服,而对我的身体不做任何改变,哈哈。
同学:太有意思啦. 你可以通过穿不同的衣服来改变你的外貌, 但是你不必为此改变自己的身体。所以你是对扩展开放的, 对吧?
小卓:是的。在面向对象设计中, 对扩展开放意味着模块/类的行为可以被扩展。那么当需求变化时我们可以用各种各样的方法制定功能来满足需求变更或者新需求。
同学:除此之外你的身体是对修改关闭的。 我喜欢这个例子. 所以, 对于核心模块或类的代码在需要扩展的时候不应该被修改。你能结合具体例子解释下吗?
小卓:当然了, 先看下面的例子.这个就不支持 "开放-关闭" 原则:
类的层次结构已经表明了这是违反"开放-关闭"原则的。
你看, 客户端类和服务端类都是具体的实现类。因为, 如果某些原因导致服务端实现改变了, 客户端也需要相应变化。
同学:有道理. 如果一个浏览器的实现和一个指定的服务器(比如IIS)紧紧的耦合在一起 , 那么如果服务器由于某种原因替换成了另外的 (比如, Apache) 浏览器也需要做相应的变化或者被替换掉. 多么恐怖的一件事啊!
小卓:非常正确!因为下面的将是一种好的设计方案:
类的层次关系展示了"开放-关闭"原则
在这个例子中, 添加了一个抽象的Server类, 并且客户端保持了抽象类的引用, 具体的Server类实现了这个抽象Server类。所以, 由于某种原因Server的实现类发生了改变, 客户端不需要做任何改变。
这里的抽象的Server类对修改关闭, 具体的Server实现类对扩展开放。
同学:我的理解是, 抽象是关键, 对吗?
小卓:是的, 基本上, 你要对系统的核心业务进行抽象, 如果你抽象化做的比较好, 很可能, 在扩展功能的时候它们不必做任何改变 (比如Server就是一个抽象的概念)。你所定义的抽象的实现 (比如, IIS服务器实现了 Server) 和抽象的代码 (Server) 要尽可能的多。这样在客户端代码中不需要做任何修改就会允许你定义一个新的实现(比如, ApacheServer)。
下一篇文章,我们将讨论“面向对象之里氏替换原则”
出处:开源中国
译者:K6F, 凡程子, 叫我蝴蝶吧, 王薇, 人头马没面, 铂金小龟, 风子, nikeff1108, sigai
链接:http://www.oschina.net/translate/how-i-explained-ood-to-my-wife?lang=chs&page=4#
了解更多软件开发知识欢迎访问中软国际教育集团技术知识库!