设计模式的分类

创建型模式,共五种:

单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。

结构型模式,共七种:

适配器模式、装饰者模式、代理模式、门面模式(外观模式)、桥梁模式、组合模式、享元模式。

行为型模式,共十一种:

策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

扩展模式:

规则模式、对象池模式、雇工模式、黑板模式、空对象模式。

六大原则

总原则:开闭原则

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

简单的说就是,当一个软件实体需要扩展的时候,不要去修改原有的代码,而是去扩展原有的代码。其实开闭原则是最基础的一个原则,下面六个原则都是开闭原则的具体形态。

为什么要采用开闭原则:

  1. 对测试的影响:通过扩展实现变化,测试只需要对新增类进行单元测试即可,单元测试是孤立的,只需要保证新类提供的方法正确就行。而如果是修改类来实现变化,则该类相应的测试方法也都要随着重构,而且当类很复杂时难免存在遗漏情况。
  2. 可以提高复用性:避免以后维护人员为了修改一个微小的缺陷或增加新功能,却要在整个项目中到处查找相关的代码逐一修改。
  3. 提高可维护性:开发新功能时,扩展一个类往往比修改一个类更容易。
  4. 面向对象开发的要求

1. 单一职责原则(Single Responsibility Principle,SRP)

定义:应该有且仅有一个原因引起类的变更。

优点:

  1. 类的复杂性降低。类的职责单一,复杂性自然就降低了。
  2. 可读性高。
  3. 易维护。
  4. 变更引起的风险降低。

难点:

  1. “职责”和“变化原因”都是不可度量的,因项目、环境而异。
  2. 过细的划分会引起类的剧增,人为的增加系统的复杂性。

建议:

  1. 接口的设计一定要做到单一原则,类的设计尽量做到只有一个原因引起变化。
  2. 职责的划分需要根据项目和经验来权衡,既要保证职责的单一性,又要尽量避免过细的划分。

2. 里氏替换原则(Liskov Substitution Principle,LSP)

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

继承的优点:

  1. 代码共享,提高代码的重用性。
  2. 提高代码的可扩展性。
  3. 提高产品或者项目的开放性。

继承的缺点:

  1. 继承是侵入式的,只要继承,就拥有了父类的属性和方法。
  2. 降低代码灵活性,子类拥有了父类的属性和方法,多了一些约束。
  3. 增强了耦合性。父类的常量、变量或方法改动时,必须还要考虑子类的修改,可能会有大段代码需要重构。

里氏替换原则四层含义:

  1. 子类必须完全实现父类的方法
    在类中调用其他类时务必使用父类或接口,如若不能,则说明类的设计已经违背LSP原则。
    如果子类不能完整的实现父类的方法,或者父类的方法在子类中发生畸变,这建议断开父子继承关系,采用依赖、聚集、组合等方式代替继承。
  2. 子类可以有自己的特性:即子类出现的地方父类未必可以出现。
  3. 覆盖父类的方法时输入参数可以被放大:输入参数类型宽于父类的类型的覆盖范围,例如 hashmap -> map。
  4. 覆盖父类的方法时输出参数可以被缩小

3. 依赖倒置原则(Dependence Inversion Principle,DIP)

定义:

  1. 高层模块不应该依赖低层模块,两者都要改依赖其抽象(模块间的依赖通过抽象产生,实现类不发生直接的依赖关系)
  2. 抽象不应该依赖细节(接口或者抽象类不依赖实现类)
  3. 细节可以依赖抽象(实现类依赖接口或者抽象类)

建议:

  1. 每个类尽量都有接口或抽象类。
  2. 变量的表面类型尽量是接口或抽象类。
  3. 任何类都不应该从具体类派生(其实只要不是超过两层的继承都是可以忍受的)。
  4. 尽量不要复写基类已实现的方法。
  5. 结合里氏替换原则使用。

面向接口编程:

接口负责定义 public 属性和方法,并且声明与其它对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确实现业务逻辑,同时在适当的时候对父类进行细化。

4. 接口隔离原则

定义:客户端不应该依赖他不需要的接口,类之间的依赖关系应该建立在最小的接口上。

四层含义:

  1. 接口尽量要小,不要出现臃肿的接口。
  2. 接口要高内聚。
  3. 只提供访问者需要的方法:每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。
  4. 接口设计是有限度的:接口设计粒度越小,系统越灵活。但是结构会越复杂、开发难度增加,可维护性降低。

建议:

  1. 一个接口只服务一个子模块或者业务逻辑。
  2. 尽量压缩接口内的方法,保证方法都是有用的,避免臃肿。
  3. 已经被污染的接口尽量去修改,若变更风险大,则采用适配器模式转化处理。
  4. 深入了解业务逻辑,拒绝盲从。

5. 迪克特法则(最少知道原则)(Least Knowledge Principle,LKP)

定义:一个对象应该对其他对象有最少的了解(低耦合)。

三层含义:

  1. 一个类只与朋友交流,不和陌生类交流,方法尽量不引入类中不存在的对象。
  2. 尽量不要对外暴露过多的 public 方法和非静态的 public 变量,尽量内敛。
  3. 自己的就是自己的。如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。

总结:
    迪米特法则的核心观念就是类间解耦,低耦合。其负面影响就是产生了大量的中转或者跳转类,导致系统复杂性提高,也为维护带来了难度。需要反复权衡,既做到结构清晰,又要高内聚低耦合。
如果一个类需要跳转两次以上才能访问到另一个类,就需要想办法重构了。

6. 合成复用原则(Composite/Aggregate Reuse Principle,CARP)

定义:是在一个新的对象里面使用一些已有的对象,使其成为新对象的一部分。新对象通过委派达到复用已有功能的效果。

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

缺点:
    通过这种方式复用建造的系统会有较多的对象需要管理;为了能将多个不同的对象作为组合块来使用,必须仔细地对接口进行定义。

简单地说:尽量首先使用合成/聚合的方式,而不是使用继承。

设计模式分类以及六大设计原则(汇总篇)相关推荐

  1. [设计原则] 六大设计原则之“开闭原则”

    [设计原则] 六大设计原则之"开闭原则" 目录 [设计原则] 六大设计原则之"开闭原则" 什么是开闭原则 为什么使用开闭原则 如何使用开闭原则 注意事项 总结 ...

  2. java设计模式总结之六大设计原则(有图有例子)

    转载:https://www.cnblogs.com/jpfss/p/9765239.html 下面来总结下自己所学习的设计模式,首先我们看下各个模式之间的关系图,下面这张图是网上比较典型的一个类图关 ...

  3. 引用防删——JAVA设计模式总结之六大设计原则

    JAVA设计模式总结之六大设计原则 从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9 ...

  4. JAVA设计模式总结之六大设计原则(一)

    从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...

  5. 【六大设计原则-SOLID】

    SOLID简介: 历史:由Robert C·Martin汇总并推广 目标: 使软件更容易被改动 是软件更容易被理解 构建可以在多个软件系统中复用的组件 组成: 名称 简写 含义 单一职责原则 SRP ...

  6. 设计模式-六大设计原则(附加实际开发建议以及计算器例子)

    使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使代码编制真正工程化,是软件工程的基石脉络,如同大厦的结构一样. 文章结构: 1.单一职责原则(SRP): 2.里氏替换原 ...

  7. 设计模式系列,六大设计原则

    设计模式和性能优化有没有关系?最近,我看到有人再讲性能优化的时候,讲到了"有些设计模式可以做到一定程度的性能优化". 我读书少,别骗我.我看过无数篇设计模式了,第一次听到有人说,设 ...

  8. 举例说明层次分析的三大原则_设计模式系列,六大设计原则

    设计模式和性能优化有没有关系?最近,我看到有人再讲性能优化的时候,讲到了"有些设计模式可以做到一定程度的性能优化". 我读书少,别骗我.我看过无数篇设计模式了,第一次听到有人说,设 ...

  9. IOS设计模式的六大设计原则之开放-关闭原则(OCP,Open-Close Principle)

    定义 一个软件实体(如类.模块.函数)应当对扩展开放,对修改关闭. 定义解读 在项目开发的时候,都不能指望需求是确定不变化的,大部分情况下,需求是变化的.那么如何应对需求变化的情况?这就是开放-关闭原 ...

  10. [转] 设计模式的六大设计原则

    转载说明: 感谢原作者吕震宇老师的分享. 原文参考链接:https://www.cnblogs.com/zhenyulu/category/6930.html? 本次转载只用于个人学习使用,并不涉及商 ...

最新文章

  1. 坐姿绳索划船 - 坐姿器械划船动作图解教程
  2. 剑指Offer - 九度1511 - 从尾到头打印链表
  3. 2019年Vue学习路线图
  4. Leetcode:169. 求众数
  5. 多边形面积(Area_Of_Polygons)
  6. [error]Cannot create __weak reference in file using manual refer XCode7.3
  7. 管理低代码公民开发人员的8个技巧
  8. 什么可以搜python答案_超星Python程序设计答案章节测试答案免费,能搜索网课答案的公众号...
  9. 实现机器学习的循序渐进指南I——KNN
  10. 理解jQuery的 $ 和 $( )的含义
  11. java访问权限的控制
  12. C语言:要求输入一个字符,如果这个字符是小写字母,将这个字母转换成大写字母,否则保持不变
  13. day20 python常用模块
  14. mysql coreseek_Coreseek使用
  15. 怎样测试通达信软件,最全图文讲解——通达信电脑版和手机版指标安装方法
  16. java中的面向对象(基础)
  17. ESXi虚拟机磁盘格式转换与减小硬盘容量的方法
  18. YOLOv5中autoanchor.py的def metric(k)的r = wh[:, None] / k[None]的理解
  19. Android studio实现番茄钟
  20. mongoDB设置用户名密码

热门文章

  1. 自动控制原理第七版胡寿松课后答案
  2. WIBU-KEY加密狗驱动软件使用说明
  3. 脚本录制软件python 按键精灵 tc_Keymouse Go鼠标键盘脚本录制下载|开源版按键精灵软件_最火软件站...
  4. 【评论送书】适合初学者的 6 个有趣的 R 语言项目
  5. 计算机组成原理 唐朔飞 思维导图
  6. android游戏菜鸟教程,菜鸟教程app
  7. Java零基础进阶教程分享,人手一套的javase实用视频教程
  8. et文件怎么转成excel_图片转PDF怎么转?这些都是文件转换的好方法!
  9. mysql成绩是什么数据类型_mysql数据类型
  10. 【JSP售票系统】JSP+SSH+MSSQL火车票铁路售票系统源码