再谈GOF设计模式的设计原则
设计模式的目的:代码重用性、可读性、可扩展性、可靠性、使程序呈现高内聚+低耦合
一、单一职责原则:实现的类职责要单一
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设计模式的设计原则相关推荐
- Go设计模式(3)-设计原则
上一篇文章Go设计模式(2)-面向对象分析与设计里讲过,做设计最重要的是保留合适的扩展点.如何才能设计出合适的扩展点呢? 这篇文章会讲解一下经典的设计原则.这些设计原则大家可能都听过,但可能没有想过为 ...
- 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...
对于设计模式,自己很早之前就看了好多本设计模式书籍,其中一些还看了好几遍,也一直希望自己能在编码的时候把这些设计模式用上去.可是,在日常的打码中,用的最多的就是单例,其次是观察者和建造者模式 ( bu ...
- php 如何设计索引_Mysql学习浅谈mysql的索引设计原则以及常见索引的区别
<Mysql学习浅谈mysql的索引设计原则以及常见索引的区别>要点: 本文介绍了Mysql学习浅谈mysql的索引设计原则以及常见索引的区别,希望对您有用.如果有疑问,可以联系我们. 索 ...
- 设计模式 - 七大设计原则(一)
设计模式 - 七大设计原则(一) 概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个 ...
- 【设计模式】设计原则
[设计模式]设计原则 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 1 开闭原 ...
- 设计模式-六大设计原则(附加实际开发建议以及计算器例子)
使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使代码编制真正工程化,是软件工程的基石脉络,如同大厦的结构一样. 文章结构: 1.单一职责原则(SRP): 2.里氏替换原 ...
- [Vue][面试]谈一谈对vue的设计原则的理解
谈一谈对vue的设计原则的理解 思路: 在vue官网上写着大大的定义和特点: -渐进式JavaScript框架 -易用.灵活和高效 渐进式JavaScript框架: 与其它大型框架不同的是,Vue被设 ...
- systemverilog硬件设计及建模_UVM方法学与设计模式(一):从OOP的本质,设计模式到设计原则...
面向对象编程(OOP)是业界使用非常广泛的一种编程范式.以C++的OOP为例,其包含通常我们所说的OOP三大要素:继承.封装和多态. C++ OOP 组成 C++的OOP内容相对来说比SystemVe ...
- 设计模式与设计原则 —— 一句话
一.设计原则 二.设计模式 范围\目的 创建型模式 结构型模式 行为型模式 类模式 工厂方法 (类)适配器 模板方法.解释器 对象模式 单例 原型 抽象工厂 建造者 代理 (对象)适配器 桥接 装饰 ...
- 软件设计模式——软件设计原则
摘要 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.无数工程师实践的代码设计经验的总结,它是面向对象思想的高度提炼和模板化,使用设计模式是为了让代码具有更高的可重用性,更好的 ...
最新文章
- Java转型(向上或向下转型)
- [YTU]_2626( B 统计程序设计基础课程学生的平均成绩)
- 实验一HSRP与STP结合
- union 和 union all 有什么不同?
- ExoPlayer用户手册
- 卧槽!我随便写的一个 API 竟获得 2.5 亿的访问量...
- NetSuite二次开发服务改变中小企业发展困境!
- PostGreSQL(1)-源码安装
- (4)理解 neutron ml2---port创建流程代码解析
- 每日算法系列【LeetCode 503】下一个更大元素 II
- 【window操作系统下Github版本的回滚问题】
- Java自学视频整理
- Ubuntu修改DNS
- 什么是软件测试工程师呢?
- 哥本哈根大学物理学家研制的创新芯片解决了量子难题;高通风投投资量子机器公司 | 全球量子科技与工业快讯第四十二期
- Java-茴香豆研究(一)
- new Date()时间格式转时间戳在苹果机iOS上无效
- matlab 指定坐标轴,matlab设置坐标轴范围
- 汽车微控制器芯片F280039CPZRQ1、F280039CSPM、F280039CSPN规格参数
- 资深运维给你讲:一个小白的运维成长故事
热门文章
- 同步助手java_QQ同步助手Java版发布:八大手机平台全覆盖
- google服务框架 闪退_没Google服务闪退?教你解决手游谷歌服务问题
- 基于python及图像识别的围棋棋盘棋子识别3——耗时优化(一行代码速度提高600倍)
- Windows XP下用Modem发送传真(ZZ)
- 【虚拟机VMWare15使用】给虚拟机硬盘添加还原卡//使用物理磁盘做虚拟硬盘
- Rsyslog日志格式实例:记录IP地址而非主机名
- 新中大计算机知识,新中大软件操作步骤
- 软件工程__CMMCMMI
- 系统架构改进--多系统用户整合
- python监测网页变化_Python利用Last-Modified实现监控网页变化