这篇文章我会不停的维护它,它将会越来越长,但它是关于我在面向对象中的一些学习的思考心得。希望对自己对各位都能实用处。



    开篇前,说明一下写这篇文章的原因。原因是由于设计模式。由于设计模式里的各种模式。都是建立在这些原则之上的。

好比盖房子须要夯实的地基,或者比作数学论证中的使用到的公理。你不能说为什么盖房子一定要建立在地基之上。也不能说为什么两点一直线,三点一面这些公理为什么就这么牛逼的存在,由于这是自然规律。你必须遵守它们。

这些设计原则也类似,它们没有24种设计模式那样华丽的身姿,但它们是程序设计江湖上真正的法则。

很多的大师总结出了这些原则。告知了我们这些后辈。我们了解了它们,会让我们更好的设计出优秀的软件框架来。

首先,先做一下知识的普及。

假设你在一些文章中看到OOD,你要懂得,这是面向对象设计(Object-Oriented Design。OOD)。假设看到一些设计书籍提到OOD,我们便知道这是指面向对象设计的意思。



    接下来,真正的主角们,这些江湖上的大佬登场了。

这些原则,盼望我们都能全然懂得。

  OOD七大设计原则一:开闭原则(Open-closed
Principle。OCP)

这个原则是由Bertrand
Meyer大师在1988年提出的。那时候我才1岁。这个原则是这样定义的:

    Software entities should be open for extension,but closed for modification。

多简单啊?!这个原则的意思大概是说:软件对扩展应该是开放的,对改动应该是关闭的。说的更通俗点儿。就是说我们开发了一个软件。应该能够对它进行功能扩展(开放)。而在进行这些扩展的时候,不须要对原来的程序进行改动(关闭)。



    各位。假设我们有经历一段时间的开发。会发现,一个软件的代码设计。假设能做到对功能扩展,对改动关闭是多么棒的事儿。这意味着这个软件维护的稳定性会大大提高,由于对改动关闭嘛,所以之前的代码,不须要太多的改动,我们以前都做过全文搜索复制替换部分文件的事情,或者在好多个文件里反复的改动某段代码。假设我们的软件编码能依照对扩展开发,对改动关闭的原则去编写,尽力的让这个原则更好的体如今软件设计中,这就是一个很棒的设计了。



    总结一下。假设依照OCP原则,软件设计开发中,会有例如以下的长处:

     1.在软件可用性上,很灵活。你能够在软件完毕对软件进行扩展。添加新的功能。这样,这个软件就能够通过不断的添加新模块满足不断变化的新需求!

2.因为对软件原来的模块不能改动。因此不用操心软件的稳定性。



    对OCP的实现,主要用到的就是抽象。各位,你们在编写代码的时候,会不会常常使用抽象的思想呢。

一定要用上抽象的思想去写代码。把系统全部可能的行为抽象为抽象底层,这些抽象类规定出全部详细的类必须提供的方法,这些作为系统设计的抽象层。

所以使得在不论什么可扩展的情况下。系统的抽象层不须要改动。同一时候。我们也能够从抽象层再派生出其它的抽象类来改动或扩展系统的行为。因此,对于可变部分,是能够扩展的。



    我们也非常easy想到,在一開始进行软件设计的时候。把全部的东西都面面俱到的考虑到是不可能的(有时候也不合适)。全部可变的东西都写入到抽象底层是不可能的。

因此,开闭原则非常难被全然实现。仅仅能在某些模块,某些程度。某个限度内使用这个原则。所以说,OCP具有理想主义的色彩。是OOD设计的终极目标。

因此,对OCP的设计原则。很多OOD大师都费尽心思,研究OCP的实现方式。

非常多原则,如:里氏代换原则、合成复用原则,依赖倒转原则。接口隔离原则,抽象类,迪米特法则等,都能够看作是OCP的实现方法。

本文參考:http://blog.csdn.net/brookes/article/details/1896422

(2014-08-22。临时写到这。)

最新文章

  1. Python删除指定时间的文件
  2. iOS 在类别里添加成员变量的方法:objc_setAssociatedObject
  3. WPF中文字体问题
  4. 第十六章:异步处理之AsyncTask的应用
  5. javaWeb中struts开发——Logic标签
  6. 转载:如何避免代码中的if嵌套
  7. lua读书笔记
  8. VS2017+xamain开发安卓(Addroid)应用
  9. 网络攻击技术:SQL Injection(sql注入)
  10. Netflix正式开源其API网关Zuul 2
  11. 一次Webservice请求的流程
  12. 高性能迷你React框架anujs1.1.0发布
  13. hdu 1069 Monkey and Banana 【动态规划】
  14. hdu 1025
  15. 解题(LevenshteinInstance--Levenshtein距离)
  16. 把mongodb服务添加到系统服务中,报错:[sc] openscmanager 失败 5
  17. API网关Kong系列(四)认证配置
  18. JavaWeb总结(十五)
  19. Task 6.2冲刺会议六 /2015-5-19
  20. UVa 11825 黑客的攻击(状态压缩dp)

热门文章

  1. MyEclipse报错Access restriction: The type BASE64Encoder is not accessible due to restriction on required library
  2. [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)
  3. [terry笔记]文件操作
  4. ArrayList 的实现原理
  5. POJ 2773
  6. Android多媒体学习六:利用Service实现背景音乐的播放
  7. extjs动态导入
  8. POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度)
  9. cocos2d-x 2.2.2 在lua中更换CCSprite的图片
  10. 【LeetCode】Palindrome Partitioning 解题报告