六大设计原则全面解析

1.单一职责原则

  定义:单一职责原则(SRP:Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。

特点

1  降低类的复杂性, 对类或接口的职责有清晰明确定义

2 提高可读性

3 提高可维护性

4 降低变更引起的风险, 接口改变只影响相应的实现类, 不影响其他类

重点

 接口一定要做到单一职责;

 类的单一职责比较难以实现, 尽量做到只有一个原因引起变化;

一个方法尽可能做一件事, 能分解就分解, 分解到原子级别;



2.里氏替换原则

定义:所有 引用基类的地方 必须能 透明地使用其子类的对象;

通俗点讲:只要 父类出现的地方子类就可以出现, 替换为子类也不会产生任何错误, 使用者不需要知道父类还是子类;

需求:

玩家玩射击气球游戏,他既能使用AK仿真枪,也可以使用步枪还可以使用手枪射击气球。

里氏替换原则核心是继承,同样它的优缺点也是继承的优缺点

继承的优点:

1   代码共享 : 共享代码, 子类都拥有父类的方法和属性, 将 父类的代码共享给了子类;

2   重用性 : 提高代码的重用性, 子类重用父类的代码;

3   子父类异同 : 子类形似父类, 异于父类, 父子都不同;

4   扩展性 : 提高代码的可扩展性, 子类就可以为所欲为了, 子类可以随意扩展父类;

5   开放性 : 提高产品或项目的开放性, 父类随意扩展, 开放性随之增加了;

继承缺点:

1  侵入性 : 继承是侵入性的, 子类 强制继承 父类的方法和属性;

2 灵活性 : 降低代码的灵活性, 子类必须拥有父类的属性和方法, 子类收到了父类的约束, 这是从子类的角度讲得;

3 耦合性 : 增强了耦合性, 父类的属性和方法被修改时, 还需要顾及其子类, 可能会带来大量的重构, 这是从父类的角度讲的;

优点:将子类单独作为一个业务来使用, 会让代码间的耦合关系都复杂, 缺乏类替换标准

缺点  将子类当做父类用, 抹杀了子类的个性;

重点

返回值   父类方法返回值类型 F, 子类方法返回值类型 S, 里氏替换原则是 S 范围必须小于F;

重载    父类 子类 方法参数类型或者数量不同, 如果要符合里氏替换要求的话, 子类参数必须 >= 父类参数, 即不能让子类自己定义的方法被调用;


21


3.依赖倒置原则


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

抽象就是接口和抽象类

细节就是具体的实现类

问题由来

类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决办法

将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

依赖倒置好处

减少类之间的耦合

提高系统稳定性

降低并发风险

提高代码可读性

依赖倒置注入实现

构造函数依赖对象

注入方法 : 通过 构造函数参数 声明依赖对象, 即构造函数注入;

Setter 方法依赖对象

通过 Setter 函数 参数 声明依赖对象, 即构造函数注入;


接口注入依赖对象

在接口方法的参数中声明依赖对象, 即接口注入;


依赖倒置本质

 通过 抽象 即 接口或者抽象类, 使 各个类 和 模块实现彼此独立, 实现模块间 松耦合;


注意点

尽量不要覆盖方法, 如果方法在抽象类中已经实现, 子类不要覆盖;


使用场景

 依赖倒置在小项目中得有点很难体现出来, 是否采用依赖倒置原则影响不大;

项目越大, 需求改变越多, 采用依赖倒置原则设计的接口或抽象类 对 实现类的约束, 会大大减少维护成本

4.接口隔离原则

定义:

--接口隔离定义 : 建立单一的接口, 功能尽量细化, 不要建立臃肿的接口;

-- 不需要的接口 : 客户端尽量不依赖其不需要的接口, 客户端需要什么接口就提供什么接口, 剔除不需要的接口, 对接口进行细化, 保持接口方法最少;

-- 最小接口 : 类间的依赖关系应该建立在最小接口上, 细化接口;

单一职责 接口隔离 区别:

单一原则  注重职责, 注重业务逻辑上得划分;

接口隔离  注重的是接口的方法尽量少

特点:

接口尽量小

拆分接口 : 接口隔离的核心定义, 不出现臃肿的接口;

接口高内聚

高内聚 : 提高接口, 类, 模块的处理能力, 减少对外界交互;

具体方法 : 接口中尽量少公布public 方法, 对外公布的 public 方法越少, 变更的风险就越小, 有利于后期的维护;

定制服务

起源 : 系统模块间的耦合需要有相互访问的接口, 这里就需要为各个 客户端 的访问提供定制的服务接口;

要求 : 只提供访问者需要的方法, 不需要的就不提供;


接口隔离限度

 粒度小 : 接口粒度越小, 系统越灵活, 但是同时使系统结构复杂, 开发难度增加, 降低了系统的可维护性;

粒度大 : 灵活性降低, 无法提供定制服务, 增大项目风险;

原子接口划分原则

接口模块对应关系 : 一个接口只服务于一个子模块 或 业务逻辑;

方法压缩 : 通过业务逻辑, 压缩接口中得 public 方法, 减少接口的方法的数量;

修改适配 : 尽量去修改已经污染的接口, 如果变更风险较大, 采用适配器模式进行转化处理;

5.开闭原则

定义:软件的实体 类, 模块, 函数 应该对扩展开放, 对修改关闭; 即 软件实体 应该 通过扩展实现变化, 不是通过 修改已有的代码实现变化;

优点 :

 利于测试 : 如果改变软件内容, 需要将所有的测试流程都执行一遍, 如 单元测试, 功能测试, 集成测试等, 如果只是扩展, 只单独测试扩展部分即可;

提高复用性 : 所有逻辑都从原子逻辑组合, 原子逻辑粒度越小, 复用性越大; 这样避免相同逻辑存在, 修改时需要修改多个此相同逻辑;

提高可维护性 : 维护一个类最好的方式是 扩展一个类, 而不是修改一个类, 如果需要修改需要读懂源码才能修改, 扩展的话只需要了解即可, 直接继承扩展;

特点:

抽象  单一  最小化

面向接口编程

高扩展性

高内聚

低耦合

6.迪米特法则

定义  最少知识原则, 一个对象应该对其它对象有最少的了解, 即一个类对自己需要耦合或者调用的类知道的最少;

生活示例看代码  

朋友间必须保持距离

距离太近示例 : 朋友间不能无话不说, 无所不知, 类A 与 B 耦合, B 将很多方法暴露给 A, 两个类之间的的耦合关系非常牢固, 这明显违反设计原则;

保持距离方法 : 将 类 B 暴露给 A 的方法封装, 暴露的方法越少越好, 类 B 高内聚, 与 A 低耦合;

 设计方法 : 一个类的 public 方法越多, 修改时涉及的范围也就越大, 变更引起的风险也就越大, 在系统设计时要注意, 能用 private 就用private , 能用protected 就用 protected, 能少用 public 就少用 public,能加上 final 就加上final;

优缺点

优点  类间解耦, 弱耦合, 耦合降低, 复用率提高;

缺点  类间的耦合性太低, 会产生大量的中转或跳转类, 会导致系统的复杂性提高, 加大维护难度;

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

推荐阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,712评论 0 14
  • 单一职责原则 (SRP) 全称 SRP , Single Responsibility Principle 单一职...
    米莉_L阅读 1,724评论 2 5
  • 设计模式六大原则 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类...
    viva158阅读 750评论 0 1
  • 转载自 设计模式六大原则[http://www.uml.org.cn/sjms/201211023.asp#3] ...
    厨子阅读 1,057评论 2 5
  • 我想和你穿越时空 一睹彼岸花的真容 一剑一酒一念江湖 半醉半醒半生红尘 山依恋着泉的温度 泉依偎在山的腰间 曲散人...
    素骊阅读 236评论 1 4