设计模式——面向对象设计原则

面向对象设计原则

软件的可维护性可复制性是两个非常重要的软件质量属性

面向对象对象设计原则是设计模式学习的基础。每一个设计模式都符合一个或者多个面向对象设计原则

单一职责原则

单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小

单一设计原则:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类里

这也意味着:就一个类而言,应该仅有一个引起他变化的原因

因为一个类承担的职责越多,他被复用的可能性就越低,同时也相当于将这些职责耦合在一起,其中一个职责变化时都可能影响到其他职责的运作,因此要将这些职责进行分离。

单一职责原则就是实现高内聚,低耦合的指导方针

开闭原则

开闭原则是面向对象的可复用设计的第一块基石

开闭原则:软件实体应当对对扩展开放,对修改方便

开闭原则是指软件实体应尽量在不修改原有代码的情况下进行拓展

任何一个软件都需要面对一个非常重要的问题,就是他们的需求是会随着时间的推移而发生变化的。当软件系统需要面对新的需求的时候应该尽量保证系统的设计框架是稳定的,如果一个软件符合开闭原则,则可以非常方便地对系统进行拓展,而且无需修改原有的代码,使得软件系统在拥有适应性和灵活性的通知具有比较好的稳定性和延续修

为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键

里氏代换原则

里氏代换原则:所有积累的抵港必须能透明地试使用其子类的对象

在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何的错误和异常。反过来就不成立,就如同我喜欢动物,那我一定喜欢狗;我喜欢狗,并不代表我喜欢所有动物。

里氏代换原则时实现开闭原则的重要方式之一,由于在使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

在运用里氏代换原则应该尽量将父类设计为抽象类或者接口,让子类继承父类或者实现父接口,并且是现在父类中声明的方法,在运行时子类实例替换父类实例,可以很方便地拓展系统功能,无需修改原有子类中的单吗,增加新功能可以通过增加一个新的子类来实现。

依赖倒转原则

依赖倒转原则:高层模块不应该以来底层木块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象

依赖倒转原则要求针对接口编程,不要针对实现编程(Program to an interface, on an implementation)。依赖倒转原则要求在程序中传递参数时或者在关联关系中尽量引用高层次的抽象层类。一个具体类应该只实现接口或者抽象类中声明过的方法,而不要给出多余的方法,否则将会无法调用在子类中增加的新方法。

程序应该尽量只在抽象层中编程,因为这样如果系统行为发生变化,只需要对抽象层进行扩展,并且修改配置文件,而不需要修改原有系统源代码,在不修改的情况下扩展系统功能。

接口隔离原则

接口隔离原则:客户端不应该依赖那些它不需要的接口

根据接口隔离原则,当一个接口太大的时候需要把它分割为一些更细小的接口,使得使用该接口的客户端只需要知道与之相关的方法即可。

1.如果把接口理解为一个类型所提供的所有方法特征的合辑的时候,接口的划分会直接带来类型的划分。一个接口只能代表一个角色,每个角色有它特定的一个接口,此时这个原则又称角色隔离原则

2.如果把接口理解成狭义的特定语言的接口。接口隔离原则表示的则是接口仅仅提供客户端所需要的行为,客户端不需要的行为则隐藏起来,应该给客户端提供尽可能小的单独的接口,而不要提供大的总接口。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只包含一个客户端所需的方法即可,这种机制又称为定制服务,即为不同用户提供宽窄不同的接口。

合成复用原则

合成复用原则:优先使用对象组合,而不是通过继承来达到复用的目的。

合成复用原则就是在一个新的对象里通过关联关系(比如组合/聚合)来使用一些已有的对象,使之成为新对象的一部分。组合/聚合可以使系统更加灵活,降低类与类之间的耦合度。这样子一个类的变化对其它类的影响比较少

通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的表现细节暴露给子类,由于积累的某些内部细节对于子类来说是可见的,所以这种复用又称为白箱复用

这种复用主要有三种缺点

1.如果基类发生改变,那么子类的实现也会不得不发生改变。

2.从基类继承而来的实现时静态的,不可能在运行时发生改变,没有足够的灵活性。

3.继承只能在有限的环境中使用

由于组合或者聚合关系可以将已有的对象纳入到新对象中,使之称为新对象的一部分,因此新对象可以调用已有对象的功能,这样做可以使成员对象的内部细节对于新对象来说不可见,所以这种复用又称为黑箱复用。和继承相比,耦合度相对低,成员变化对新对象的影响不大,合成复用可以在运行时动态进行。

迪米特法则

迪米特法则:每一个软件单位对其他单位都只有最少的只是,而且局限于那些和本单位密切相关的软件单位

迪米特法则要求一个软件实体应该尽可能少的和其他实体发生相互作用。这样做在其中一个模块发生修改的时候会尽可能少地影响到其他模块,扩展也相对容易。应用迪米特法则可以降低系统的耦合度,使得类和类之间保持松散的耦合关系。

用生动的话来说,迪米特法则主张**“不要和陌生人通话,只和你的朋友通信”**。对于一个对象来说,他的朋友包括:

1.当前对象本身(this)

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

3.当前对象的成员对象

4.如果当前对象的成员对象是一个集合,那么你和中的元素也是朋友

5.当前对象所创建的对象

这样做可以降低系统的耦合度

迪米特法则还要求在设计系统时应该尽量减少对象之间的交互

在类的划分上应该尽量创建松耦合的类,类之间的耦合度越低,越有利于复用,一个处于松耦合的类一旦被修改也不会给相关的类造成很大的影响。

在类的结构设计上,每一个类都应该尽量降低其成员变量和成员函数的访问权限、

在类设计上,只要有可能,一个类型应该设计成不变类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值