【设计模式】六大原则总结

一、『Single Responsibility Principle』单一职责原则

单一职责原则的核心精神是:一个类,或者一个接口,最好只做一件事情,当发生变化时,他只能受到单一的影响;因为职责过多,可能引起变化的原因将会很多,这样导致职责和功能上的依赖,将严重影响其内聚性和耦合度,混乱由此而生。

单一职责的原则在现实生活中早就实践于现代公司体制与工业生产上,如公司的各个部门职责分明相互独立,生产流水线的某一环节只需关注上螺丝,而另一环节只做零件组装等等;这一原则使庞大的系统组合起来还能各司其职,井井有条,即使某个部门、某个环节出了问题或需要改动,你只需去动那个要变动的地方即可,从而避免因职责功能不明而导致不必要的的混乱。同样,程序代码的设计也是如此,功能和职责单一化也是衡量代码优良的一个标准;交杂不清的职责和功能将使得代码看起来特别别混乱、别扭且一发而动全身,更严重的是在日后的维护中你得花更多的时间去理清他的逻辑,并且这地方的变动几乎是必然引起让人头痛的BUG,你将花费更多的精力,承担更多的风险!

在代码工程的实施中,遵循单一职责原则将会带来诸多好处:类的复杂性将降低,简单明细的代码将使可读性将大大提高,自然而然可维护性亦将同步提高,可维护性提高将预示着因变更引起的风险会大大降低,最重要的前边的好处将会是你工作轻松愉悦、思路清晰、远离脑爆头大……专注即高效,单一既轻松,人事皆如此。

二、『Liskov Substitution Principle』里氏替换原则

里氏替换原则的核心精神是:在使用基类的的地方可以任意使用其子类,能保证子类完美替换基类;这一精神其实是对继承机制约束规范的体现。在父类和子类的具体实现中,严格控制继承层次中的关系特征,以保证用子类替换基类时,程序行为不发生问题,且能正常进行下去。

里氏替换原则主要发力点是继承基础上的抽象和多态,具体就是子类必须实现父类的方法,是重写;这里要注意重写(Override)与重载(Overload)的区分,即使参数的数据范围发生变化,也能将重写变成重载!而你原本只是想把所继承的方法完善的具体点儿!如果是这样的话绝对会引起以后业务逻辑的混乱。

里氏替换原则是关于继承机制的设计原则,违反里氏替换原则将会使继承变的一塌糊涂;而遵循里氏替换原则能够保证系统具有良好的的拓展性,我们可以随时根据需要增改不同的子类,这将大大增强程序的健壮性,让版本的升级可以做到非常好的兼容;同时基于多态的抽象机制,能够很好的减少代码冗余,避免运行期的类型判别等;而在项目的实施中不同的子类对应着不同的业务,使用父类做参数,不同子类可以轮番上阵,必然强大!

*在此重温【重写与重载】

多态性是面向对象编程的一种特性,和方法本身无关。

方法的重载,就是同样的一个方法能够根据输入数据的不同,做出不同的处理——有不同的参数列表,甚至不同的返回值(静态多态性)

方法的在重写,是子类继承自父类的相同方法,输入参数一样,但要做出有别于父类的操作,要覆盖父类方法。——相同参数,相同返回值,不同实现(动态多态性)

用好重写和重载可以设计一个结构清晰而简洁的类,重写和重载在编写代码过程中的作用非同凡响。

三、『Interface Segregation Principle』接口隔离原则

接口隔离原则的核心精神是:尽量使用多个专门的单一的小接口,避免庞大的总接口;专业点的说法是类间的依赖关系尽量建立在最小的接口上。接口尽量的小,但是小不是说一个接口一个方法,小也要不违背单一职责原则;接口应该严格体现内聚性,尽可能的少公布public方法,在开发中不能让功能繁琐的大接口出现;一个类对另一个类的依赖应该建立在最小的接口上,不能强迫与之无关的方法,否则将会造成接口污染。遵循接口隔离原则将使接口有效的将细节和抽象隔离,体现了对抽象编程的一切优点,接口隔离强调接口的单一性。而大接口因强制要求实现类完成它所有的并非必须的方法、属性等,从而造成严重的设计浪费,对以后的维护和改动带来难以衡量的困难,对“接口”这个概念造成极大的侮辱。

但在现实中,如何把握接口越小越好,这个度很难界定,颗粒度小固然灵活,但同时会造成结构的复杂化,以下有几个把握规则可以参考:一个接口只服务于一个子模块或业务逻辑,服务定制;通过业务逻辑压缩接口中的public方法,让接口看起来精悍;已经被污染了的接口,尽量修改,如果变更风险太大,则用适配器模式进行转化处理;根据具体的业务,深入了解逻辑,用心感知去控制设计思路。

具体如何实施接口隔离,主要有两种方法:1、委托分离,通过增加一个新的接口类型来委托客户的请求,隔离客户和接口的直接依赖,注意这同时也会增加系统的开销;2多重继承分离,通过接口的多重继承来实现客户的需求,这种方式相对较好。具体的使用,视情况而定。

怎么准确的实践接口隔离原则呢?有一本书上写得非常好:实践、经验和领悟。

四、『Low Of Demeter』迪米特法则

迪米特法则也叫做做最少知识原则,其核心精神是:不和陌生人说话,通俗之意是一个对象对自己需要耦合关联调用的类应该知道的更少。这样会导致类之间的耦合度降低,每个类都尽量减少对其他类的依赖,因此,这也很容易使得系统的功能模块相互独立,之间不存在很强的依赖关系。

迪米特法则很纯情、比较保守,不希望和其他的类建立直接的接触;如果真的需要交互关系,也是希望通过自己比较熟的中间类来传达信息。因此,在迪米特法则的实际应用中可能会导致大量的中介类。

迪米特法则的核心就是解耦,弱耦合能使类的复用率提高,在实际中这个解耦是有限度的解耦,不能因法则而法则,应权衡利弊而为之。

五、『Open Close Principle』开闭原则

开放封闭原则,简称开闭原则。开闭原则是面向对象设计中“可复用设计”的基石原则,是面向对象设计中最重要的原则之一,属于“易筋经”级别的,诸如里氏替换啦,接口隔离啦、依赖倒置啦,都可以看做是开闭原则的实现;在面向对象设计中,抽象类和接口,即是因开闭而生,应开闭而存!

开闭开闭,开放封闭。开放的是拓展,封闭的是修改,即降低耦合,封装变化的集中展现。开放扩展,则意味着当有新的或变化的需求时,可以通过对现有代码的拓展来实现,而不需要该变原有程序的结构与内容;封闭修改,指的是程序设计一旦完成,其预定功能即按照既定独立工作,在不可对其做修改操作(太绝对了、太完美了!)开闭原则的核心思想就是抽象编程,而不是对具体,因为抽象是相对稳定的,再说了我们还有接口(好多地方接口和抽象类都放一块儿说了)。让类依赖于固定的抽象对象,即可以达到封闭修改的目的;而通过面向对象的继承和多态机制,又可以实现对抽象类的继承,通过复写其方法来改变固有的行为操作,也可以实现新的拓展方法,即可以达到开放的目的。

归根究底,开闭原则就是“万变不离其宗”;变,即变的是需求,宗,既是系统强大稳定的基础核心;开放封闭,既可以通过开放拓展满足需求的变化,又可以通过封装而使系统稳定。开闭原则,实乃程序设计心法,金刚般若波罗蜜!

六、『Dependence Inversion Principle』依赖倒置原则

依赖倒置原则,重要的三层含义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。其核心思想是:依赖于抽象。

关于“倒置”这个词。准确的讲,这是因为传统的软件开发方法,如结构化的分析和设计,倾向于创建高层模块依赖于低层模块、抽象依赖于具体的软件结构。在实际上,这些方法的目标之一就是去定义描述上层模块如何调用低层模块的子程序层次结构。所以,相对于传统的过程化的方法通常所产生的那种依赖结构,一个设计良好的面向对象的程序中的依赖结构就是“被倒置”的。

在系统代码的实现中,依赖关系一定会存在于类与类、模块与模块之间。当两个模块之间存在紧密的耦合关系时,最好的方法就是分离接口和实现:在依赖之间定义一个抽象的接口使得高层模块调用接口,而底层模块实现接口的定义,以此来有效控制耦合关系,达到依赖于抽象的设计目标抽象的稳定性决定了系统的稳定性,因为抽象是不变的;依赖倒置原则的运用还可以减少并行开发引起的风险,提高代码的可读性和维护性。依赖于抽象是面向对象设计的精髓,也是依赖倒置原则的核心。

依赖倒置原则是许多面向对象技术的优点的根本。合理地应用它对于建立可复用的框架是必要的。对于构建富有变化弹力的代码也是相当重要的。而且,由于抽象和具体相互完全分离,代码的维护就容易很多了。依赖于抽象是一个通用的原则,而某些时候依赖于细节则是在所难免的,必须权衡在抽象和具体之间,方法不是一层不变的,技术只是一种业务关系实现的工具,取舍自知。

时间: 2025-01-14 12:48:03

【设计模式】六大原则总结的相关文章

设计模式六大原则之里氏替换原则

一.概念: 里氏替换原则:LSP (Liskov Substitution Principle),如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型. 通俗的定义:所有引用基类的地方必须能透明地使用其子类的对象. 二.例子: 以浇水为例.人,拿到工具[水管.水桶.瓶子],装水后都可以浇水.[水管.桶.瓶子]都可以获取水.应该有个loadWater方法.有watering 浇水功能

设计模式六大原则(3)--依赖倒置原则

定义: 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口:抽象接口不应该依赖于具体实现.而具体实现则应该依赖于抽象接口.依赖倒置原则英文全称为Dependence Inversion Principle,简称为DIP. 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修改类A,会给程序带来不必要的风险. 解决方案: 将类A修改为依赖接口I,类B和

设计模式六大原则(4)--接口隔离原则

定义: 客户端不应该依赖它不需要的接口:类之间的依赖关系应建立在最小的接口之上.接口隔离原则英文全称为Interface Segregation Principle ,简称为ISP. 个人理解: 通俗的来说,接口不能臃肿庞大,而使根据具体需要尽量的细化.接口中的方法也要尽可能的少.接口是设计对外的一种契约,通过分散定义多个接口可以预防将来变更的扩散,使得真个系统变得更加稳定和更具有可维护性. 问题由来: 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类C不是最小的接口,那么

设计模式六大原则(5):迪米特法则

迪米特法则 定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 迪米特法则(Law of  Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用. 如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度.迪米特法则可降低系统的耦

设计模式六大原则(2):里氏替换原则

里氏替换原则 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型. 定义2:所有引用基类的地方必须能透明地使用其子类的对象. 问题由来:有一功能P1,由

设计模式六大原则(4):接口隔离原则

接口隔离原则 定义:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法. 解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系.也就是采用接口隔离原则. 接口隔离原则(Interface  Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端

设计模式六大原则(1):单一职责原则

单一职责原则 定义: 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 解决方案: 遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2时,也不会使职责P1发生故障风险. 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒

设计模式六大原则(1):单一职责原则(转载)

设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 解决方案:遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2时,也不会使职责P1发生故障风险. 说到单一职责原则,很多人都会不屑一顾

设计模式六大原则(3):依赖倒置原则(转载)

设计模式六大原则(3):依赖倒置原则 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修改类A,会给程序带来不必要的风险. 解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率. 依赖倒置原则

设计模式六大原则——迪米特法则(LoD)

1.背景 在图书馆借书,刚开始的时候,直接跑到相应的楼层去,到里面去转,去找要借的书,在里面溜达半天才能找到:后来知道图书馆有一个电脑查询处,然后直接在电脑上输入想要借的书,电脑就会显示你想要借的书的信息,还有所在的相关楼层存放的相关位置. 2.定义 迪米特法则(Law of Demeter)又叫作最少知识原则(LKP,Least Knowledge Principle),就是说一个对象应当对其他对象有尽可能少的了解,类与类之间的了解的越多,关系越密切,耦合度越大,当一个类发生改变时,另一个类也