设计模式 - 设计原则

1. 单一职责原则

Single Responsibility Principle,简称SRP.

这个设计原则备受争议, 只要你想和别人争执、 怄气或者是吵架, 这原则是屡试不爽的。 如果你是老大,看到一个接口或类是这样或那样设的,你就问一句: “你设计的类符合SRP原则吗? ”保准对方立马“萎缩”掉, 而且还一脸崇拜地看着你, 心想: “老大确实英明”。

单一职责原则的定义是: 应该有且仅有一个原因引起类的变更。
单一职责原则在实际中很难做到,我们只能尽量满足.
接口一定要做到单一职责, 类的设计尽量做到只有一个原因引起变化。

2. 里氏替换原则

Liskov Substitution Principle, 简称 LSP

  • 第一种定义, 也是最正宗的定义: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T .(如果对每一个类型为S的对象o1, 都有类型为T的对象o2, 使得以T定义的所有程序P在所有的对象o1都代换成o2时, 程序P的行为没有发生变化, 那么类型S是类型T的子类型。 )
  • 第二种定义: Functions that use pointers or references to base classes must be able to useobjects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类的对象。 )

通俗点理解就是:
只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。 但是, 反过来就不行了, 有子类出现的地方, 父类未必就能适应。

3. 依赖倒置原则

Dependence Inversion Principle,简称 DIP

High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions hould not depend upon details.Details should depend upon abstractions.
翻译过来, 包含三层含义:

  • 高层模块不应该依赖低层模块, 两者都应该依赖其抽象;
  • 抽象不应该依赖细节;
  • 细节应该依赖抽象。

一句话 面向接口编程

用张图来表示就是:要尽量避免左边的情况,而使用右边的.


依赖倒置原则.png

依赖的方式:

  • 通过构造传递并保存到成员变量
  • 使用setter 方法并保存到成员变量
  • 在使用的方法中的传递参数中

依赖倒置原则在小项目中得不到很好的体现,而在大项目则是很好的利器!

4. 接口隔离原则

  • Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该依赖它不需要的接口。 )
  • The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)

简单来说就是:
建立单一接口, 不要建立臃肿庞大的接口

它跟单一职责原则容易混淆,到底是单一职责原则还是接口隔离原则,区别是他们站的角度不同:

  • 单一职责原则:类和接口职责单一,注重的是 职责
  • 接口隔离原则:接口的方法尽量少

我们要做是:
根据接口隔离原则拆分接口时, 首先必须满足单一职责原则。

5. 迪米特法则

迪米特法则(Law of Demeter, LoD) 也称为最少知识原则(Least Knowledge Principle, LKP)
定义:一个对象应该对其他对象有最少的了解

理解:

  • 对一个类,暴露的public方法越少越好
  • 只和朋友交流 (朋友指:成为变量或方法参数,除此之外都不是朋友)(也就是方法中不需要知道其他类了)
暴露的public方法越少越好.png
只和朋友交流.png

6. 开闭原则

这是六个原则中最重要的一个设计原则!如果把其他五个原则比喻为是西安类的话,这个原则就是他们的抽象类!

前五个原则就是指导设计的工具和方法, 而开闭原则才是其精神领袖。

Software entities like classes,modules and functions should be open for extension but closed for modifications.(一个软件实体如类、 模块和函数应该对扩展开放, 对修改关闭。 )

实现开闭原则的方式有很多,比较普遍的是通过扩展一个类的方式(extends),这样可以复写原有的方法又不会对原有的类造成影响!

为什么要开闭原则?

  • 通过扩展来添加功能,原有的测试类不需要改变,只需要添加新的测试类
  • 粒度越小, 被复用的可能性就越大.缩小逻辑粒度, 直到一个逻辑不可再拆分为止。
  • 读懂原有的代码已经很困难了,在原有的基础上在进行修改更不可能了!
  • 需要在设计之初考虑到所有可能变化的因素

如何实现开闭原则?

  • 使用抽象:抽象是对变化的封装,也是对代码的约束.通过抽象类或接口规划功能,在实现类中尽量不能出现public方法.抽象尽量稳定,不能随意添加或修改.
  • 元数据控制模块i行为:元数据可以理解为配置参数,在spring中通过配置xml可以进行IOC的控制,从而不需要修改java代码.
  • 制定项目章程:执行约束,开发人员都遵循.
  • 封装变化:将变化封装到接口或抽象类中,使用23中设计模式来封装变化.

设计原则只是些原则,我们只能尽量遵循,实现过程中还要具体问题具体分析,一句话「尽量遵循设计原则」

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容