【设计模式】神通广大之六大原则

本文详细阐述了六大设计原则,包括单一职责原则、开放封闭原则、依赖倒转原则、里氏代换原则、迪米特原则及合成/聚合复用原则。通过理解这些原则,开发者可以更好地掌握设计模式并构建出更为稳定、灵活的系统。

             六大原则是学习设计模式的一个前提。只有掌握了六大原则以后,设计模式才能很好的去理解和把控。所有的模式都是在这些原则的基础之上发展起来的,有的只涉及一个原则,有的则涉及多个。

       一、宏观

       

       二、细节

     (1)单一职责原则

定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

优点:

①可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;

②提高类的可读性,提高系统的可维护性;

变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。     

     (2)开放封闭原则

定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

优点:开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。

     (3)依赖倒转原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

优点:降低类之间的耦合性,提高系统的稳定性,降低修改程序造成的风险。

例如:公司某工程师设计了一款宝马图纸,以后造宝马就按照它来,轮子统一是X型号。然而有一天,一大客户只想要Y型号轮子的宝马,公司表示很无奈,损失严重。如果当时没有规定必须用X型号轮子,只说四个轮子即可(规定了接口),就不会出现今天的问题。

     (4)里氏代换原则

定义:子类型必须能够替换掉它们的父类型。

①子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
②子类中可以增加自己特有的方法。
③当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
④当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

优点:在父类关闭的条件下实现了子类扩展。

弊端:比如使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能会产生故障。

     (5)迪米特原法则

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

优点:每个类都减少了不必要的依赖,因此可以降低耦合关系。

弊端:过分的使用迪米特原则,会产生大量这样的中介和传递类,导致系统复杂度变大。

     (6)合成/聚合复用原则

定义:尽量使用合成/聚合,尽量不要使用类继承。( 聚合是一种弱关系,体现的是A包含B,B不是A的一部分;组合是一种强关系,体现的是A与B之间的整体-部分关系。)

优点:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

应用: 它要求我们尽量少用继承,防止类的盲目扩大。在“桥接模式”中体现比较深刻。  这其实也体现了单一职责的思想。尽量减少类的功能,降低耦合。

      附加:(7)接口隔离原则

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

看下面两张图你就会明白:

                 (红字为不用的方法)                                                 

接口隔离&单一职责:其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。

       三、总结 

       无论什么原则,都离不开抽象、封装、继承、多态。再回想一下前面说的原则:单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;合成/聚合原则告诉我们要尽量使用组合聚合;迪米特法则告诉我们要降低耦合;而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。   

           

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值