您的位置:首页 > 编程语言 > Java开发

JAVA设计模式原则理解

2014-12-06 11:02 417 查看

1.开闭原则:

定义:对修改关闭,对扩展开放。简单理解是在设计模块时,在不必修改模块代码的时候,实现模块功能的扩展。

关键在于抽象,抽象层预见了所有可能的扩展,因此在任何扩展情况下都不会改变,使得系统的抽象层不需要修改。从而满足了开闭原则的第二条,对修改关闭。由于抽象层导出一个多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的。

典型:策略模式,工厂模式

2.接口

保证了关联的可插入性,调用的可插入性

3.抽象类

具体类不是用来继承的。两个具体类之间的继承关系,可考虑重构为以下方式,C中抽象类尽量抽象共同代码,提供代码的复用率,尽量不要抽象具体数据,以保证节省内存资源



4.接口与抽象类的区别

1)抽象类提供了某些方法的部分实现,接口则不是,这大概是java抽象类唯一的优点。抽象类中加入了一个新的具体方法,所有的子类型一下子就得到了这个新的具体方法

2)代码重构的角度上讲,将一个单独的java具体类重构成一个java接口的实现很容易,只需要声明一个java接口,并将重要的方法添加到接口声明中,然后在具体类定义后面加上一个合适的implements子句即可。而一个已有的具体类添加一个java抽象类却不name容易,因为这个具体类可能已经有一个超类了,这样一样,这个定义抽象类只好继续往上移动,编程这个超类的超类,造成等级结构的所有成员都会受到影响。

3)建议联合使用java接口和java抽象类。首先声明java接口,然后给出一个java抽象类为该接口提供一个缺省实现。



5.里氏代换原则

假设有两个类,一个是base类,一个是derived类,并且derived类是base类的子类,那么一个方法如果可以接受一个基类对象b的话,那么它必然可以接受一个子类对象d

6.依赖倒转原则

定义:要依赖于抽象,不要依赖于具体。

依赖倒转的意义是什么?简单地说,传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块:抽象层次依赖于具体层次,倒转原则是把这个错误的依赖关系倒转过来!

抽象层次依赖于具体层次的含义是什么呢?抽象层次包含的是应用系统的商务逻辑和宏观,对整个系统来说重要的战略性决定,是必然的体现;而具体层次则包含有一些次要的与实际有关的算法和逻辑,以及战术性的决定,带有相当大得偶然性选择。具体层的代码会经常会有变动,不能避免出现错误。抽象层次依赖于具体层次,使许多具体层次的细节的算法变化立即影响到抽象层次的宏观逻辑,导致微观决定宏观,偶然决定必然。以至于低层次每一行代码的修改,都会造成较高层次的修改。应将复用的重点放在抽象层次上。

依赖倒转的另外一种表述是:抽象不应该依赖于细节,细节应该依赖于抽象。或者叫做针对接口编程,不是针对实现编程。

典型:模板模式

7.接口隔离原则

1) 当把“接口”理解成一个类型所提供的所有方法特征的集合的时候,这就是一种逻辑上的概念,接口的划分将直接带来类型的划分。可以把接口理解成角色,一个接口只能代表一个角色,每个角色都有它特定的一个接口,此时,这个原则可以叫做“角色隔离原则”。

2) 如果把“接口”理解成狭义的特定语言的接口,那么ISP表达的意思是指接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。在面向对象编程语言中,实现一个接口就需要实现该接口中定义的所有方法,因此大的总接口使用起来不一定很方便,为了使接口的职责单一,需要将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并都承担某一单一角色。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只包含一个客户端(如子模块或业务逻辑类)所需的方法即可,这种机制也称为“定制服务”,即为不同的客户端提供宽窄不同的接口。

3)该接口承担了太多职责,一方面导致该接口的实现类很庞大,在不同的实现类中都不得不实现接口中定义的所有方法,灵活性较差,如果出现大量的空方法,将导致系统中产生大量的无用代码,影响代码质量;另一方面由于客户端针对大接口编程,将在一定程序上破坏程序的封装性,客户端看到了不应该看到的方法,没有为客户端定制接口。因此需要将该接口按照接口隔离原则和单一职责原则进行重构,将其中的一些方法封装在不同的小接口中,确保每一个接口使用起来都较为方便,并都承担某一单一角色,每个接口中只包含一个客户端(如模块或类)所需的方法即可

 4)在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强迫客户依赖于那些它们不用的方法。

8.合成/聚合原则

定义:尽量使用合成/聚合,尽量不要使用继承。

继承复用的优点:
1)新的实现较为容易,因此超类的大部分功能可以通过继承关系自动进入子类

2)修改和扩展继承而来的实现较为容易。

继承复用的缺点:

1)继承复用破坏了封装,因此将超类的实现细节暴露给子类,由于超类的内部细节通常对于子类是透明的,因此这种复用是透明的复用,“白箱”复用

2)如果超类的实现发生改变,那么子类的实现也不得发生改变。

区分IS-A与Has-A

IS-A代表一个类是另一个类的一种,has-a代表一个类是另一个类的一个角色。



9.迪米特原则

定义:只与直接朋友通话

朋友的定义:

1)当前对象本身(this)

2)以参量形式传入到当前对象方法中的对象

3)当前对象的实例变量直接引用的对象

4)当前对象实例变量如果是一个聚集,那么聚集中的元素也都是朋友

5)当前对象所创建的对象。

缺点:

会使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联,但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。

典型模式:中介者模式,门面模式



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: