23种设计模式之6大原则

来源:互联网 发布:vmware 14 安装mac os 编辑:程序博客网 时间:2024/05/13 23:28

一、单一职责原则

单一职责原则:就一个类而言,应该仅有引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,当变化发生时,设计会遭受到意想不到的破坏。事实上,我们完全可以找出来进行分类,分离。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。其实要去判断是否应该分离出类来,也不难,那就是如果你能够想到多余一个的动机去改变一个类,那么这个类就具有多余一个的职责,就应该考虑类的职责分离。

优点:降低类的复杂性;提高类的可读性;提高代码的可维护性和复用性;降低因变更引起的风险。


二、开放-封闭原则

开放-封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。

这个原则其实是有两个特征,一个是说“对于扩展是开放的”,另一个是说“对于更改是封闭的”。

无论模块是多么封闭,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化

面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是开放-封闭原则的精神所在。

开放封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好开发人员应该对程序中呈现出频繁变化的那些部分做出抽象,然后,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。

重要性体现:提高复用性;提高维护性;提高灵活性;易于测试。


三、依赖倒转原则

依赖倒转原则:抽象不应该依赖细节,细节应该依赖抽象也即以下俩点
 ①高层模块不应该依赖底层模块。俩个都应该依赖抽象。
 ②抽象不应该依赖细节。细节应该依赖抽象。

说白了,就是要针对接口编程,不要对实现编程。举个例子,无论电脑的主板、CPU、内存、硬盘都是在针对接口设计的,如果针对实现来设计,内存就要对应到具体的某个品牌的主板,那就会出现换内存需要把主板也换了的尴尬。

所以说,PC电脑硬件的发展,和面向对象思想发展是完全类似的。这也说明世间万物都是遵循牟宗类似的规律,谁先把握了这些规律,谁就最早成为了强者。

依赖倒转原则其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。


四、里氏代换原则

里氏代换原则:子类型必须能够替换掉它们的父类型。

只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

比方说,猫是继承动物类的,以动物的身份拥有吃喝跑叫等行为,可当某一天,我们需要够牛羊也拥有类似的行为,由于它们都是继承动物,所以除了更改实例化的地方,程序其他处不需要更改。

正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展,才使得开放--封闭的原则成为了可能。

优点:代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的可重用性;
提高代码的可扩展性;提高产品或项目的开放性。 
缺点:1.继承是入侵式的。只要继承,就必须拥有父类所有属性和方法。 
           2.降低代码的灵活性。子类必须拥有父类的属性和方法,使子类受到限制。 
           3.增强了耦合性。当父类的常量、变量和方法修改时,必须考虑子类的修改,这种
      修改可能造成大片的代码需要重构。

五、迪米特原则

迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。

迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。

迪米特法则其根本思想,是强调了类之间的松耦合。在程序设计时,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用。

简言描述就是:只与你直接的朋友们通信;不要跟“陌生人”说话;每一个软件单位
对其他的单位都只有最少的了解,这些了解仅局限于那些与本单位密切相关的软件单位。 
对迪米特法则进行模式设计有两个:外观模式、中介者模式

六、接口隔离原则

1.

一个类对另外一个类的依赖性应当是建立在最小的接口上的

 

              2.

一个接口代表一个角色,不应当将不同的角色交给一个接口。

 

              3.

不应该强迫客户使用它们的不同方法。

 

如图所示的电子商务系统在三个地方会使用到订单类:一个是门户,只能有查询方法;一

个是外部系统,

有添加订单的方法;

一个是管理后台,

添加、

删除、

修改、

查询都要用到。

 

“原子”在实践中的衡量规则:

 

1.

 

一个接口只对一个子模块或者业务逻辑进行分类。

 

2.

 

只保留接口中业务逻辑需要的

public

方法。

 

3.

 

尽量修改污染了的接口,若修改的风险较大,则可采用适配器模式进行转化处理。

 

4.

 

接口设计应因项目而异,因环境而异,不能照搬教条。


1.一个类对另外一个类的依赖性应当是建立在最小的接口上的               
2.一个接口代表一个角色,不应当将不同的角色交给一个接口。               
3.不应该强迫客户使用它们的不同方法。 
如电子商务系统在三个地方会使用到订单类:一个是门户,只能有查询方法;一个是外部系统,有添加订单的方法;一个是管理后台,添加、删除、修改、查询都要用到。 
“原子”在实践中的衡量规则: 
1. 一个接口只对一个子模块或者业务逻辑进行分类。
2. 只保留接口中业务逻辑需要的public方法。 
3. 尽量修改污染了的接口,若修改的风险较大,则可采用适配器模式进行转化处理。 
4. 接口设计应因项目而异,因环境而异,不能照搬教条。


1 0
原创粉丝点击