设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则

(3)单一职责原则

  单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。例如,我们在写一个窗体应用程序,一般都会生成一个Form这样的类,于是我们就把各种各样的代码,像算法、数据库访问SQL都写到这样的类中,这就意味着,无论何种需求要来,你都需要更改这个窗体类,维护麻烦,不能复用,缺乏灵活性。

  如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

  软件设计真正要做的内容就是发现职责并把那些职责相互分离。其实要去判断是否应该分离出类来,也不难,就是如果你能够想到一个的动机去改变一个类,那么这个类具有多于一个的职责,就应该考虑将类的职责分离。

(4)开放封闭原则

  开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。这个原则具有两个特征:①是对于扩展是开发的(Open for extension),②对于修改是封闭的(Closed for modification)[ASD]。

  需求的变化,软件可以相对容易修改来适应需求的变化。

  开放-封闭原则的意思是你设计的时候要尽量让这个类是足够好,写好了就不要去修改了;如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。

  但绝对的对修改封闭是不可能的。无论模块是多么“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块 对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化的种类,然后构造抽象来隔离那些变化[ASD]。等到变化发生时立即采取行动[ASD],即在 发生变化时,就及早去想办法应对更大变化的可能。

(5)依赖倒转原则(依赖倒置原则)

  解释为:抽象不应该依赖细节,细节应该依赖于抽象。说白了,就是针对接口编程。不要对实现编程。具体一点就是接口或抽象类,只要接口是稳定点,那么任何一个更改都不用担心其它部分受影响,这就使得无论高层模块还是底层模块都可以很容易地被复用。

•里氏代换原则

  通俗解释:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,父类都被替换为它的子类程序的行为不会发生变化。

  也正因为有了这个原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不会受到影响时,父类才能真正被复用,而子类能够在父类的基础上增加新的行为。由于子类的可替换性,父类才使得父类类型的模块在无需修改的情况下就可以扩展。里氏代换原则使开发封闭成为可能。

  依赖倒转其实就是谁也不要依靠谁,除了约定的接口,大家都可以灵活自如。依赖倒转其实可以说是面向对象设计的标志,用哪种语言编写程序不重要, 如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计。遵循依赖倒转就是让程序都依赖抽象,而不是相互依赖。

转载于:https://www.cnblogs.com/xiaobang/archive/2013/05/29/3105638.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

是网关吗_智能家居网关功能这么多,你都知道吗?

在科技发达的今天,我们的生活也开始趋向于智能化,智能家居已经迎来了新时代。电动窗帘、扫地机器人、电视、空调等电器都能智联wifi,可是使用的时候得一个个去控制,数量多的话懒癌们肯定嫌麻烦的。所以很多聪明的人都选择安装智能…

eventfd以及epoll原理分析

这两天公司代码中用到了epoll。然后在跟同事闲扯的过程中发现了Linux中有eventfd。两者虽然名字看起来差不多,但是相关性倒是不多。为了弄明白这两个东西到底在内核上是怎么实现的,这两天将内核这两个部分的相关代码看了下,也终于明白了这两个…

一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

【题目描述】 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量(QoS,Qualityof Service)问题已越来越受到重视。网络中采用的数据包调度机制与网络的服务质量 QoS 有着密切的关系。研究表明传统的基于队列的调…

iOS vs. Android,应用设计该如何对症下药?

摘要:从iOS到Android,两大平台应用设计有何不同?又都存在什么样的问题?Android定制性太高,该如何进行UI设计?在CMDN CLUB第28期活动中,咕咚网高级产品经理王磊,从iOS、Android谈起&a…

postman数据保存在哪里_Postman 历史记录导出的解决方案

Postman 可以说是我在 CTF 中使用最多的工具了。它确实非常好用,但我并没有完全掌握它的使用之道,因此大量的历史请求堆在一起,显得环境无比混乱。 虽说是有想要改变的想法,但这些历史记录还是非常重要的,一时间难以割舍。于是便开始寻找导出的方案。 indexedDB 我们知道,…

cs8900a网卡驱动--寄存器

1. CS8900内部有一个4k的RAM用于访问其内部寄存器,称为PacketPage。 2. LineCTL 网卡状态设置 从上图看到,此寄存器的6,7位用于设置网卡的收发使能。8,9位用于设置网卡状态。是10BASE-T还是 AUI。下面这图更详细介绍了8&…

python输入序列语句_Python基础教程(一) - 序列:字符串、列表和元组

这一章我们主要研究这样一些类型,他们的成员是有序排列的,并且可以通过下标偏移量访问的,这类Python类型统称为序列,包括字符串、列表和元组。序列类型操作符成员关系操作符(in、not in):成员关系操作符是用来判断一个…

由于找不到openni2_Kinect开发教程八:OpenNI2显示深度、彩色及融合图像

在《Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示》中,小斤介绍了OpenNI读取深度与彩色图像数据的方法,并且借助OpenCV进行显示。OpenNI2在接口上与OpenNI有了较大变化,具体更新可以查看《OpenNI Migration Guide》。从获…

目录服务用户OSX: ARD的基于目录服务用户权限

改章节笔者在上海游玩的时候突然想到的...今天就有想写几篇关于目录服务用户的笔记,所以回家到以后就奋笔疾书的写出来发布了 从Apple Remote Desktop 3.3开始, 加入了对目录服务用户/用户组的支持, 也就是说可以利用目录用户/用户组, 来定义该用户/用户组的ARD权限…

__builtin_expect详解

在GTK2.0源码中有很多这样的宏:G_LIKELY和G_UNLIKELY。比如下面这段代码: if (G_LIKELY (acat 1)) /* allocate through magazine layer */ { ThreadMemory *tmem thread_memory_from_self(); guint ix SLAB_INDEX (allocat…

python3界面实例_程序人生——python3下tkinter的界面示例

# written by wangluojisuanimport tkinterfrom tkinter import messageboxglobal main_formglobal lbl_nameglobal entry_nameglobal entry_text_varglobal chk_varglobal chkglobal text_areadef window_quit():if tkinter.messagebox.askyesno("提示", "退出…

jQuery图表插件 JS Charts

JS Charts 是一款免费的基于javascript的轻量级插件,用JS Charts 绘制图表是很轻松地事,因为你只需要关心客户端的脚本。 Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...Loading...转载于:https://www.cnb…

python官方文档怎么用_python帮助文档怎么使用

在python命令行中输入help(),然后再次输入time,可以获得很详细的模块文档;或者输入time.localtime,可以获得简略的函数参数显示;或者输入range,可以获得很详细的类的文档。方法一在python命令行输入以下内容…

ACCEPT

ACCEPT 章节:Linux 程序员手册 (2)更新:2010-09-10到 易美翻译 翻译名字 accept - 通过套接口接受一个连接 概要 #include Esys/types.h> /* 参看 “注意小节” */ #include Esys/socket.h>int accept(int sockfd, struct sockaddr *addr, sockl…

使用正则把数字前面的符号替换_正则表达式(一) 基本表达式

定义 正则表达式(Regular Expression)用某种模式去匹配一类字符串的公式,主要用来描述字符串匹配的工具。 匹配文本或字符存在不止一个部分满足给定的正则表达式,这是每一个这样的部分都被称为一个匹配。 匹配分为以下三种类型: 形容词性的匹…

解构给默认值_ES6学习 --函数参数默认值与解构赋值默认值

1. ES6的解构ES6中引入了解构赋值的操作,其作用是:将值从数组Array或属性从对象Object提取到不同的变量中即分为两种情况:从数组Array中解构,以及从对象Object中解构①.从数组中解构const [a, b] [1, 2]//a 1, b 2当然这些是基…

jsp思维导图_2019年经济法基础思维导图

参加2019年初级考试的考生们明天可以打印准考证啦时间:2019.4.26-5.5日(传送门:http://kjbm8.mof.gov.cn/ksbm/usercxzkz.jsp)为了帮助大家快速梳理教材考点,下面蓝星职业教育为大家整理了初级会计职称考试各章节思维导图,希望给大…

海量数据持久层解决方案_爱数AnyBackup重磅发布海量非结构化数据超可用解决方案...

海量非结构化数据有三大备份恢复问题一直没有得到有效解决:备份慢、恢复慢、备份数据不可查询。这三大问题已经对行业数字化转型造成了重大阻碍。今天,AnyBackup Family 7线上发布会——重磅发布海量非结构化数据超可用解决方案。AnyBackup以创新超可用技…

【PHP】伪静态 - 1. 使用正则表达式实现

在我们实际开发中,有需要,不希望使用真静态,但是希望利于SEO, 可以考虑使用伪静态。 http://localhost/news.php?typemusic&id100 我们希望这个地址可以用下面的访问url来替换 http://localhost/new-music-id100.html 上面的问题可以使用…

wpf 使子ui元素可视区域不超过父元素_对游戏UI设计的一点思考

UI决定了一个游戏的初体验,甚至决定了玩家的初始留存,甚至可以说决定了一个游戏的品质,虽然看起来是表象的,却是直指游戏核心的。简单讲,玩家认可一款游戏永远都是造型场景好,剧情好,画质棒&…