面向对象设计原则小结
一。SRP 单一职责原则
<1>一个类最多只有一个可以变化的职责
<2>一个类只会受一个变化的影响
<3>一个继承等级结构只有一个可以变化的地方
说到这里,先来说说接口,这些体会是从阎宏的<java与模式>和自己的体会
<1>接口可以分为java的接口和接口,所谓java的接口,就是满足java语法和定义,而接口是广义的,表示一些契约,也可理解为服务,角色,责任,定义了方法的集合
<2>对于java中实现接口的类,可以没有任何关系,只要他们能提供相同的服务,就可以继承同样的接口,比如Swing里面的监听器,如ActionListener, 只要你对组件的
事件感兴趣,你就可以注册,所以这些注册的类是没有任何关系的。在比如java.lang.Runnable。
<3>其实当看书的时候,我就有一个疑问,为什么有的类可以继承像ActionListener的接口,来扩展功能,而有些接口要委托,这是下面自己的理解,
对于像ActionListener的接口,是一个单一的接口,不会存在某些的变化,一个类继承这样的接口,表示你具有这样的功能。
当时对于某些接口,是存在很多变化的,如果一个具体类,继承存在很多变化的接口,那就是将两种变化混合在一起。这样对于以后的扩展是不方便的,所以
为什么某些类是直接继承单接口,有些类是委派的。其实主要看接口的应用环境。
<4>另外,接口是表示一种变化,接口封装变化就成为不变化的,这样不是对软件以后的扩展很方便,这就是变化和不变化的理解
SRP说到一个类最多只有一个可以变化的职责,但是也可以有其他的职责,可以委派出去,这些委派出去的职责是通过接口的,因为接口封装变化,接口是不变化的,所以一个类委托职责,这是不变化的,但是在自己的内部实现的接口,在对外面是不变化的,但是在内部,就是包含各式各样的变化,所以就是说一个类最多只有一个可以变化的职责。
二。开闭原则
<1>一个软件实体(模块,类,函数)应该对扩展是开发的,对修改是关闭的
要做到开闭原则,有两个重要地方需要注意:抽象,对变化的封装
现在具体来说说自己的体会:
<1>其实开闭原则的关键还是封装变化,变化最好封装成接口,哈哈,有是接口,所以你要理解接口的重要性,接口对外是不变化,对内是变化。
软件系统抽象出来的应该是系统的商业逻辑,一个软件系统的商业逻辑一般是固定不变得。所以的细节是依赖于商业逻辑存在的,所以系统不变的是商业逻辑,
变化的是细节
<2>对变化的封装
大家要注意,继承不是具体到特殊的,每一具体的继承表示一个变化,特别要注意的,在java中,类得定义是根据行为的,因为他们具有相同的行为,每个具体的继承是变化的具体体现
不要将一个变化和另外一个变化混在一起,其实在SRP中也提到
其实,对于所有的设计模式,都是在不同程度上面做到开闭原则,有的设计模式可以做到绝对的开闭原则,但是有的设计模式只是在部分方面上面实现的开闭原则
三。接口和抽象类
<1>接口是实现扩展的方式,对于接口其他的特性,上文中已经提到。
<2>抽象类是用来继承的,具体类不是用来的继承的。这个观念大家要注意啦。
<3>对于java类中的定义,是根据行为去定义一个类得。
<4>接口是对客户的承诺,承诺如果做出,就很难更改.
四。里氏替换原则
<1>里氏替换原则是继承复用的基石
<2>子类可以替换基类出现的地方,而且软件的行为不改变,不仅仅表现在替换上面,而且表现在行为的替换和一致性上面。
对于父类适用的方法,对于子类也应该同样适用.
五。依赖倒置原则
<1>要依赖于抽象,而不要依赖于具体。至于其中的原因,大家也都应该熟悉,就是保证当软件变化的时候,软件的可维护性和可复用性。
怎么实现依赖倒置,对于java而已当然是借口
<2>可参见的方法:对于java中的变量声明,数据类型的声明,返回值的声明等等都使用java接口
<3>当然对于不可变得类,也就没有必要弄的这么复杂
六。接口隔离原则
<1>使用多个单一的接口,总比使用一个大接口好,对于不同的客户定制不同的服务,对于不同的客户开放不同的接口,
其实这样就做到信息的隐藏和封装,只让客户知道他该知道的,这样对于以后软件的变化,影响会达到最小.
<2>其中要注意的,就是接口的合理划分。
七。组合/聚集复用原则
<1>对于类扩展的责任,优先使用组合聚合,而不是继承。
<2>组合/聚合是黑箱复用,可以根据变化随时调整,但是继承是白箱复用,对于父类的修改会牵扯到所有的类
八。迪米特法则
<1>最少知识原则,你只和你熟悉的人通讯,应该减少对象之间的通讯,就算是要通讯,也要减少通讯的宽度和深度
以上是再次对OO设计原则的体会,对于不同的设计,要做出不同的权衡,以上只是作为参考依据。具体要根据实际的情况而定.
分享到:
相关推荐
类类的作用类的组成对象和类的关系面向对象在python中的实现如何定义一个类怎样通过类创建(或者说实例化)一个对象通过类创建对象时底层执行机制属性相关属性和变量的区别及判定依据对象属性增删改查类属性增查改删...
供热工程设计说明文书未完待续.doc
数据结构课程设计停车场管理问题未完.doc
9--[小黑点的旅行(未完待续)].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码9--[小黑点的旅行(未完待续)].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码9--[小黑点的旅行(未完待续)].zip...
扫雷游戏 未完 大家一起完成 扫雷游戏 未完 大家一起完成
android播放器未完待续
探索 ES6(未完)
第1章 FPGA概述 1.1 FPGA的发展历程 1.2 FPGA的基本原理 1.3 FPGA的设计方法 1.4 FPGA的设计流程 1.5 总结与结论 未完待续
11.综合布线系统图(未完).dwg
NEURAL CODE COMPLETION 未完ABSTRACT Code completion, an essential part of modern s
未完工程及遗留问题清单(表格模板、XLS格式).XLS
本个写的用EXCEL打印支票的小程序,还有些功能未完成,望高手指点,QQ:414775791
小黑点的旅行(未完待续)-少儿编程scratch项目源代码文件案例素材.zip
04747 Java程序设计(一) 自考 考点 大纲(自己总结,未完待续)
毕业设计题目(大家可以参考,有些题目还有问题的) 压力容器液位测量 多功能遥控小车 基于RS232的仓库多点温度、湿度、气压检测系统 自动控制升降旗系统 基于RS485的温度报警系统 基于模糊算法的水温控制系统的...
SIM900A模块系列调试(未完)1
pl-sql练习(未完).txt
softmax回归相关Python代码(未完待续)
个人手机网游作品展示,未完待续
购买按揭未完的二手车合同协议.pdf