【大话一角】——六兄弟

简介: 【大话一角】——六兄弟

在大话这本书中我认识了很好的六个兄弟他们就是设计模式中的六个原则——单一职责原则、里氏代换原则、开放—封闭原则、依赖倒转原则、迪米特法则、合成/复用原则。这几个兄弟非常的讲义气,在我进入设计模式的学习的开始他们几个就陆续的出来陪伴我,并且一直从开始陪伴到结束,他们帮我分别程序中的不良行为,当然他们也非常的喜欢和大家交朋友,下面我就把我的这六位兄弟一一介绍给大家。


20141122113748812.jpg

(一)单一职责


定义:就一个类而言,应该仅有一个引起它变化的原因。


详解:这个原则主要是防止类的职责过多问题,当一个类的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。


实例:我们现在的大公司都有很好的组织结构,各个部门都只负责自己的任务,研发就关心研发,销售就关心销售等,如果一个庞大的公司只有一个部门一个负责人,那么它的各个流程都互相影响,那么结果就可想而知了。


(二)开放—封闭


定义:软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。


详解:开放封闭原则是面向对象的核心所在,遵循这个原则可带来面向对象技术所声称的巨大好处:也就是可维护、可扩展、可复用、灵活性好、开发人员应该仅仅对程序中呈现出频繁变化的那些部分做出抽象,然而对应应用程序中的每个部分都刻意的进行抽象不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。此原则简单的说就是“关闭修改,开放扩展”,这样我们可以更好的使系统在第一个版本后不断的推出新版本。


实例:公司的工资管理系统中,因为我们有很多的不同的工人,工资计算就有很多的不同,按小时计算、按月计算、按年计算,现在要求增加一个基本工资和提成的计算方法。


20141122140135043.jpg


20141122140540962.jpg


(三)里氏代换


定义:子类必须能够替换掉它们讷的父类。


详解:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出来父类和子类的对象的区别,也就说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。这个原则是继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响,父类才能被真正的复用,而子类才能在父类的基础上增加新的行为!


实例:在古时兄妹很多,并且子女的手艺都是从父亲那里继承,就像扑鱼的技术,种地的方法等,并且随着时代的进步,子类会摸索自己新的技术和方法:



(四)依赖倒转


定义:高层模块不应该依赖底层模块,两个都应该依赖抽象;


抽象不应该依赖心结,细节应该依赖抽象;


详解:依赖倒转其实可以说是面向对象设计的标识,用那种语言来写程序不重要,如果编写是考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象设计,反之那就是过程化的设计了。


实例1:当我们开发较大的项目的时候,我们会访问数据库,所以我们就把访问数据库的代码写出了函数,每次做新项目的时候就去调用这些函数,这就是高层模块依赖底层模块。


20141122144221408.jpg

实例2:就想我们的PC机,CPU、内存、硬盘都需要具体的主板,主板一坏,所有部件就都没有用了,这显然是不合理,反过来,如果内存坏了,也不应该影响其他部件不能用才对,而不管是高层模块还是底层模块都依赖抽象,具体来说就是接口或者抽象类才是最合理的。


(五)迪米特法则


定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。


详解:迪米特法则的根本思想是强调了类之间的松耦合,在类的结构设计上,每一个类都应当尽量降低成员的访问权限,这就是说类应该包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开,因为类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。


实例:我们的小区最重要的一个部门就是物业部,它关系着居民的日常生活的方方面面,当居民有事情需要物业来解决的时候,我们直接给物业部打电话,而不是找具体的人;



20141122150507234.jpg(六)聚合复用


定义:在程序中我们尽量的用组合/聚合来代替类的继承。


详解:聚合表示一种弱的 ‘拥有关系’,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;组合则是一种强的 ‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样;


20141122151341976.jpg


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


实例:



20141122152910671.jpg20141122152432593.jpg从上面两张类图中我们可以看出,对象的继承关系是在编译是就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化,当你需要复用子类是如果继承下来的实现不适合解决新问题,则父类必须重写或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。


小结


通过上面的介绍我就把我的六个好兄弟介绍给大家了,其中开放封闭这个哥们很值得我们好好的和他交流,我就在前一段时间带领着我这六位兄弟打下了设计模式这一片天下,他们说会一直跟随我继续在编程这条路上打天下,一起走向胜利的巅峰!


目录
相关文章
|
2月前
|
数据采集 弹性计算 供应链
阿里云服务器包年包月、按量付费和抢占式实例有什么区别?如何选择?
阿里云服务器提供包年包月、按量付费和抢占式实例三种付费模式。包年包月预付费,长期使用更划算,适合稳定业务;按量付费按小时计费,灵活但成本较高,适合短期或波动场景;抢占式实例价格优惠最高达90%,但可能被释放,适合无状态应用。根据需求选择可兼顾成本与稳定性。
|
11月前
|
机器学习/深度学习 数据采集 人工智能
深度探索:人工智能在医疗影像诊断中的应用与挑战####
本文旨在深入剖析人工智能(AI)技术在医疗影像诊断领域的最新进展、核心优势、面临的挑战及未来发展趋势。通过综合分析当前AI算法在提高诊断准确性、效率及可解释性方面的贡献,结合具体案例,揭示其在临床实践中的实际价值与潜在局限。文章还展望了AI如何与其他先进技术融合,以推动医疗影像学迈向更高层次的智能化时代。 ####
|
存储 编译器 C语言
C语言中的关键字与标识符详解
C语言中的关键字与标识符详解
411 0
阿里云国际版账号登录不上去,账号被风控怎么办?
阿里云国际版账号登录不上去,账号被风控怎么办?
|
Python Windows 容器
Python Tkinter教程(二)——Label控件、Frame控件、Button控件的完整参数和所有方法及详细用法
Python Tkinter教程(二)——Label控件、Frame控件、Button控件的完整参数和所有方法及详细用法
542 0
|
JavaScript
精通Vue.js系列 │ Vue组件的命名规则
每个Vue组件都有一个名字。组件的名字可以采用lower-kebab-case(小写且短横隔开)或者upper-camel-case(大写且驼峰式)命名规则。
1144 2
精通Vue.js系列 │ Vue组件的命名规则
|
算法 前端开发 芯片
静态时序分析简明教程(六)]时钟组与其他时钟特性
静态时序分析简明教程(六)]时钟组与其他时钟特性
静态时序分析简明教程(六)]时钟组与其他时钟特性
|
缓存 CDN
U3D客户端框架之支持断点续传的文件下载器实现方案
文件下载器是应用程序的基础模块,为应用程序与外部网络交互提供了必要的桥梁。该模块设计初衷是为了热更新过程中,下载CDN站点上的文件资源,所以下载器会验证 要下载的文件是否存在于CDN中。如果存在允许下载器继续工作;如果不存在会跳过本地下载。做这层检测是为了安全性考虑,不允许随意下载网络资源。如果有需求可以跳过这层检测。
|
人工智能 运维 负载均衡
国民级消消乐背后的网络技术支持:不畏巨“峰”,“运”筹帷幄 ——阿里云ALB助力乐元素构建用户体验更丝滑,运维管理更简单的网络
近日,阿里云网络携手乐元素共同部署建设了基于7层业务自动化调度的弹性网络架构,进一步提升乐元素在用户服务上的娱乐体验。提到乐元素相信大家都不陌生,作为从事移动网络游戏的研发、运营及广告平台,其代表作就是先前提到的国民级三消休闲游戏《开心消消乐》, 在中国消除类游戏排名连续多年领先。秉承将游戏和AI技术相结合,通过科技驱动体验的理念,乐元素通过出色的产品为世界各地的人们带来了无尽的欢乐。
1359 0
国民级消消乐背后的网络技术支持:不畏巨“峰”,“运”筹帷幄 ——阿里云ALB助力乐元素构建用户体验更丝滑,运维管理更简单的网络
|
自然语言处理 搜索推荐 算法
中文分词工具(LAC) 试用笔记
中文词法分析LAC 支持Python、C++、JAVA、Android 用接口调用,其他语言的话就需要开发者自己自行封装了,笔者这次决定使用Python进行实验,在文中也会把相关代码给贴出来,给大家作为一个参考
762 0
中文分词工具(LAC) 试用笔记