设计模式的目的:代码重用性、可读性、可扩展性、可靠性、使程序呈现高内聚+低耦合

一、单一职责原则:实现的类职责要单一
    1.应该有且仅有一个原因引起类的变更。
    
    如果一个类承担多个职责的后果:
        1.一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;
        2.当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。
    
二、依赖倒置原则:在高层模块中,以抽象为基础搭建稳定的框架,把实现细节的任务交给实现类去完成
    1.高层模块(调用方,稳定)不应依赖低层模块(被调用方,变化),高层和低层模块应该依赖抽象(稳定);
    2.抽象不应依赖细节(变化),细节应该依赖抽象。
    
    依赖倒置原则的主要作用:降低类间的耦合性、提高系统稳定性、减少并行开发引起的风险、提高代码的可读性和可维护性
    依赖导致原则的关系传递方式(三种):接口传递、构造函数传递、setter方式传递
    依赖倒置原则注意事项和细节:
        1.低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好;
        2.变量的声明类型尽量是抽象类或者接口,这样能使用多态,是的基类指针或者引用,指向派生类的对象;
        3.继承时遵循里氏替换原则
    
三、接口隔离原则:设计接口精简单一
    1.客户端不应该依赖它不需要的接口;
    2.类间的依赖关系应建立在最小的接口上。
    
    单一职责原则和接口隔离原则的对比:
    1.单一职责原则注重的是职责;约束的对象是类,它是针对程序中的实现和细节;
    2.接口隔离原则注重的是对接口依赖的隔离;约束的对象是接口,主要针对抽象和程序整体框架的构建。
    
    接口隔离原则实现方法:
    1.接口尽量小,但要有限度:一个接口只服务于一个子模块或业务逻辑;
    2.为依赖接口的类定制服务:只提供调用者需要的方法,屏蔽不需要的方法;
    3.了解环境,拒绝盲从:每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑;
    4.提高内聚,减少对外交互:使接口用最少的方法去完成最多的事情。
    
    
四、里氏替换原则:不要破坏继承体系
    1.子类型能够替换父类型:程序中使用父类对象的地方,能够透明地使用其子类对象替换;
    2.使用继承时,子类尽量不要重写父类的方法;
    3.在适当情况下,可以通过聚合、组合、依赖来解决问题
    
    里氏替换原则主要作用:
    1.是对开闭原则的补充,是对实现抽象化的具体步骤的规范;
    2.它克服了继承中重写父类造成的可复用性变差的缺点;
    3.动作正确性的保证:类的扩展不会给已有系统引入新的错误,降低了代码出错的可能性。
    
五、开闭原则:      解耦、单一、高内聚就是开闭原则的精神纲领;
    1.对扩展开放,对修改封闭;用抽象构建框架,用实现扩展细节;
    2.当软件发生变化时,尽量通过扩展软件实体行为来实现变化,而不是通过修改已有代码来实现变化;
    3.遵循其它设计原则,以及使用设计模式的目的就是遵循开闭原则。
    
    开闭原则的主要作用:
    1.对软件测试的影响:只需要测试通过扩展代码实现完成的模块;
    2.可以提高代码的可复用性:粒度越小,被复用的可能性就越大:在OOP中,根据原子和抽象编程可以提高代码的可复用性;
    3.可以提高代码的可维护性:稳定性高、可延续性强,从而易于扩展和维护。
    
    开闭原则实现方法:抽象约束、封装变化(通过接口或者抽象类定义一个相对稳定的抽象层,将相同的可变因素封装在相同的具体实现中)

六、迪米特法则(最少知道原则):  要降低耦合度,只与朋友关系进行通信。
    1.一个对象应该对其他对象保持最少了解;
    2.类与类关系越密切,耦合度越大;
    3.一个类对自己依赖的类遵循最少知道原则,对于被依赖的类不管多复杂,都尽量将逻辑封装在类的内部,对外除了提供public方法,不泄露其他任何信息;
    4.只与朋友关系进行通信:对象之间的耦合就说明二者有朋友关系。耦合方式有很多,依赖、关联、组合、聚合等。陌生的类最好不要以局部变量的形式出现在类的内部。

七、优先使用组合,而不是类继承:
    1.对象组合属于黑箱复用,类继承属于白箱复用;
    2.类继承在某种程度上破坏了封装性,子类父类耦合度高;
    3.对象组合则要求被组合的对象具有良好定义的接口,耦合度低。
    
    组合和继承的对比:
    1.组合维持了类的封装性(成分对象的内部细节,新对象看不见);继承破坏了类的封装性(父类的实现细节暴露给子类);
    2.组合的两个类耦合度低(只能使用成分对象的接口);继承关系的父子类耦合度高(父类的任何改变都会引起子类发生变化);
    3.组合的灵活性高(运行时多态进行);继承的灵活性低受限(静态,编译时已经确定,运行时不能发生改变)。
    
八、封装变化点:
    1.使用封装来创建对象之间的分界层,让设计师可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
    
九、针对接口编程、而不是针对实现编程
    1.不将变量类型声明为某一个特定的具体类,而是声明为某个接口;
    2.客户程序无需获知对象的具体类型,只需要知道对象所具有的的接口;
    3.减少系统中的各部分的依赖关系,从而实现“高内聚,松耦合”的类型设计方案。

再谈GOF设计模式的设计原则相关推荐

  1. Go设计模式(3)-设计原则

    上一篇文章Go设计模式(2)-面向对象分析与设计里讲过,做设计最重要的是保留合适的扩展点.如何才能设计出合适的扩展点呢? 这篇文章会讲解一下经典的设计原则.这些设计原则大家可能都听过,但可能没有想过为 ...

  2. 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...

    对于设计模式,自己很早之前就看了好多本设计模式书籍,其中一些还看了好几遍,也一直希望自己能在编码的时候把这些设计模式用上去.可是,在日常的打码中,用的最多的就是单例,其次是观察者和建造者模式 ( bu ...

  3. php 如何设计索引_Mysql学习浅谈mysql的索引设计原则以及常见索引的区别

    <Mysql学习浅谈mysql的索引设计原则以及常见索引的区别>要点: 本文介绍了Mysql学习浅谈mysql的索引设计原则以及常见索引的区别,希望对您有用.如果有疑问,可以联系我们. 索 ...

  4. 设计模式 - 七大设计原则(一)

    设计模式 - 七大设计原则(一) 概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个 ...

  5. 【设计模式】设计原则

    [设计模式]设计原则 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 1 开闭原 ...

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

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

  7. [Vue][面试]谈一谈对vue的设计原则的理解

    谈一谈对vue的设计原则的理解 思路: 在vue官网上写着大大的定义和特点: -渐进式JavaScript框架 -易用.灵活和高效 渐进式JavaScript框架: 与其它大型框架不同的是,Vue被设 ...

  8. systemverilog硬件设计及建模_UVM方法学与设计模式(一):从OOP的本质,设计模式到设计原则...

    面向对象编程(OOP)是业界使用非常广泛的一种编程范式.以C++的OOP为例,其包含通常我们所说的OOP三大要素:继承.封装和多态. C++ OOP 组成 C++的OOP内容相对来说比SystemVe ...

  9. 设计模式与设计原则 —— 一句话

    一.设计原则 二.设计模式 范围\目的 创建型模式 结构型模式 行为型模式 类模式 工厂方法 (类)适配器 模板方法.解释器 对象模式 单例 原型 抽象工厂 建造者 代理 (对象)适配器 桥接 装饰 ...

  10. 软件设计模式——软件设计原则

    摘要 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.无数工程师实践的代码设计经验的总结,它是面向对象思想的高度提炼和模板化,使用设计模式是为了让代码具有更高的可重用性,更好的 ...

最新文章

  1. Java转型(向上或向下转型)
  2. [YTU]_2626( B 统计程序设计基础课程学生的平均成绩)
  3. 实验一HSRP与STP结合
  4. union 和 union all 有什么不同?
  5. ExoPlayer用户手册
  6. 卧槽!我随便写的一个 API 竟获得 2.5 亿的访问量...
  7. NetSuite二次开发服务改变中小企业发展困境!
  8. PostGreSQL(1)-源码安装
  9. (4)理解 neutron ml2---port创建流程代码解析
  10. 每日算法系列【LeetCode 503】下一个更大元素 II
  11. 【window操作系统下Github版本的回滚问题】
  12. Java自学视频整理
  13. Ubuntu修改DNS
  14. 什么是软件测试工程师呢?
  15. 哥本哈根大学物理学家研制的创新芯片解决了量子难题;高通风投投资量子机器公司 | 全球量子科技与工业快讯第四十二期
  16. Java-茴香豆研究(一)
  17. new Date()时间格式转时间戳在苹果机iOS上无效
  18. matlab 指定坐标轴,matlab设置坐标轴范围
  19. 汽车微控制器芯片F280039CPZRQ1、F280039CSPM、F280039CSPN规格参数
  20. 资深运维给你讲:一个小白的运维成长故事

热门文章

  1. 同步助手java_QQ同步助手Java版发布:八大手机平台全覆盖
  2. google服务框架 闪退_没Google服务闪退?教你解决手游谷歌服务问题
  3. 基于python及图像识别的围棋棋盘棋子识别3——耗时优化(一行代码速度提高600倍)
  4. Windows XP下用Modem发送传真(ZZ)
  5. 【虚拟机VMWare15使用】给虚拟机硬盘添加还原卡//使用物理磁盘做虚拟硬盘
  6. Rsyslog日志格式实例:记录IP地址而非主机名
  7. 新中大计算机知识,新中大软件操作步骤
  8. 软件工程__CMMCMMI
  9. 系统架构改进--多系统用户整合
  10. python监测网页变化_Python利用Last-Modified实现监控网页变化