`
sunjing21
  • 浏览: 157078 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

面向对象设计原则小结 (未完)

 
阅读更多

面向对象设计原则小结


一。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设计原则的体会,对于不同的设计,要做出不同的权衡,以上只是作为参考依据。具体要根据实际的情况而定.


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics