浅谈23种设计模式

浅谈23种设计模式

类之间的关联关系:在使用Java、C#和C++等编程语言实现关联关系时,通常将一个类作为另一个类的属性。
  (1)双向关联,两个类互相为各自的属性,比如顾客类Customer和商品类Product,顾客拥有商品,商品与某个顾客相关联。
  (2)单向关联,一个类作为另一个类的属性,顾客Customer拥有地址Address,UML图用带箭头的直线表示,由Customer指向Address。
  (3)自关联,此类的属性对象类型属于该类本身,例如节点类Node的成员又是节点对象。
  (4)多重关联,Form类的对象包含多个Button类,一个Button只与一个Form相关联。
  (5)聚合关系,是一种特殊的关联关系,强调部分与整体,比如汽车Car和引擎Engine,引擎可以脱离汽车单独存在,但是是汽车的组成部分,UML图中用带空心菱形的直线表示,由汽车指向引擎,表示汽车contains引擎。(Engine类可以在Car类的外部实例化,然后作为参数传入Car类)
  (6)组合关系,是一种特殊的关联关系,也强调部分与整体关系,比如头Head和嘴Mouth,Mouth不能脱离Head单独存在,UML图用带实心菱形的直线表示,由Head指向Mouth,表示头has嘴。(Mouth类在Head类的构造函数中实例化,Head销毁则Mouth也销毁)
*组合关系和聚合关系与普通的关联关系主要是语义上的区别,表示关联的程度。

类之间的依赖关系:表示某个类的方法使用另一个类的对象作为参数,UML图用带箭头的虚线表示,由依赖方指向被依赖方。

泛化关系:即继承关系,UML图中用带空心三角形的直线表示,例如Student类 is-a-kind-of Person类

接口与实现关系:表示类实现接口中所声明的操作。UML图中用带空心三角形的虚线表示。

 

面向对象设计原则:
  (1)单一职责原则:类的职责要单一,不能将太多的职责放在一个类中。
  (2)开闭原则:可以在不修改一个软件实体的基础上去扩展其他功能。
  (3)里氏代换原则:在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。
  (4)依赖倒转原则:针对抽象层编程,不要针对具体类编程。
  (5)接口隔离原则:使用多个专门的接口来替代一个统一的接口。
  (6)合成复用原则:在系统中尽量多使用组合和聚合关系,尽量少使用甚至不使用继承关系。
  (7)迪米特法则:一个软件实体对其他实体引用越少越好,或者说如果两个类不必彼此直接通信,那么两个类就不应当发生直接的相互作用,而是引入一个第三者发生间接交互。

设计模式定义:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

 

五种对象创建型模式:
1.工厂方法模式
  工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
2.抽象工厂模式
  提供一个创建一系列相关或依赖对象的接口,而无须指定他们具体的类。
3.建造者模式
  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
4.原型模式
  用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。原型模式的基本工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象复制原型来实现创建过程。
5.单例模式
  单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

七种结构型模式:
1.适配器模式
  将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。
2.桥接模式
  将抽象部分与它的实现部分分离,使它们都可以独立地变化。
3.组合模式
  组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性。
4.装饰模式
  动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。
5.外观模式
  外部与一个子系统通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子接口更加容易使用。
6.享元模式
  运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。
7.代理模式
  给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

十一种行为型模式:
1.职责链模式
  避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止
2.命令模式
  将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
3.解释器模式
  定义语法的文法,并且建立一个解释器来解释语言中的句子,这里的“语言”意思是使用规定格式和语法的代码。
4.迭代器模式
  提供一种方法来访问聚合对象,而不是暴露这个对象的内部表示。
5.中介者模式
  用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
6.备忘录模式
  在不破坏封装的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
7.观察者模式
  定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并自动更新。
8.状态模式
  允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
9.策略模式
  定义一系列算法,将每一个算法封装起来,并让他们可以相互替换。
10.模板方法模式
  定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
11.访问者模式
  表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

 

转载于:https://www.cnblogs.com/jianglingjun/p/6664292.html

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

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

相关文章

网页布局基础

1、盒子模型的第一层到第五层: border、padding content、background-image、background-color、margin 2、清除浮动。对受到浮动影响的标签作以下操作: 1、clear: both; 2、clear: right; clear: left; 3、设置宽度width: 100%(或者固定宽度) overflow…

mysql与串口通信_虚拟机串口与主机串口通信·小程序(下)

上次说到的,不能做到实时通信。那么开两个进程就可以了,一个用来监听是否有消息传来,一个用来等待用户输入。那么,先来复习一下进程的相关概念。进程结构linux中进程包含PCB(进程控制块)、程序以及程序所操纵的数据结构集&#xf…

浅谈我所见的CSS命名风格

在两年工作中,总结一下我所见的css命名风格。 1.单一class命名 .header {width: 500px; } .item {text-indent: 20%; } 优点:简单,渲染效率高。 缺点:零散,没有模块化。 2. 后代选择器class命名 .header .item a {font…

Java规范请求中的数字

你们都了解Java社区流程 (JCP),不是吗? JCP是为Java技术开发标准技术规范的机制。 任何人都可以注册该站点并参与对Java规范请求(JSR)的审查和提供反馈,并且任何人都可以注册成为JCP成员&#x…

ORACLE MOS 翻译

http://blog.csdn.net/msdnchina/article/details/53174196转载于:https://www.cnblogs.com/zengkefu/p/6665950.html

自从我这样撸代码以后,公司网页的浏览量提高了107%!

欢迎大家前往腾讯云 社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯IVWEB团队发表于云 社区专栏 作者:yangchunwen HTTP协议是前端性能乃至安全中一个非常重要的话题,最近在看《web性能权威指南(High Performance Browser Networking)》&a…

python数列分段_按范围分段的Python数组

首先,定义你的“极”数第二,根据这些“极”数生成间隔第三,定义尽可能多的列表。在然后,对于每个间隔,扫描列表并在相关列表中添加属于该间隔的项代码:source [1, 4, 7, 9, 2, 10, 5, 8]poles (0,3,6,25)…

51nod 1278 相离的圆

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。例如:4个圆分别位于1, 2, 3, 4的位置&…

让我们将包变成模块系统!

使用构建系统将许多项目分为模块/子项目( Maven , Gradle , SBT …); 编写模块化代码通常是一件好事。 将代码分为构建模块主要用于: 隔离代码部分(减少耦合) api / impl拆分 仅将…

R语言日期的表示和运算(详细总结)

1、取出当前日期 Sys.Date() [1] "2014-10-29" date() #注意:这种方法返回的是字符串类型 [1] "Wed Oct 29 20:36:07 2014" 2、在R中日期实际是double类型,是从1970年1月1日以来的天数 typeof(Sys.Date()) [1] "double" …

html高度塌陷问题解决

高度塌陷的问题: 当开启元素的BFC以后,元素将会有如下的特性 1 父元素的垂直外边距不会和子元素重叠 开启BFC的元素不会被浮动元素所覆盖 开启BFC的元素可以包含浮动的子元素 如何开启元素的BFC 设置元素浮动 设置元素绝对定位 …

java空格键_Java KeyPressed-如果其他键也太旧,则无法检测是否按下了空格键

如标题所示,在我的Java游戏中,无法检测是否同时按下空格键和其他键。例如,空格键是射击键,而箭头键则使玩家移动。如果我按下向上箭头键,向左箭头键和空格键,那么它应该向左上方发射子弹。但是,…

How to fix the bug “Expected required, optional, or repeated.”?

参考:https://github.com/tensorflow/models/issues/1834 You need to download protoc version 3.3 (already compiled). Used protoc inside bin directory to run this command like this:tensorflow$ mkdir protoc_3.3tensorflow$ cd protoc_3.3tensorflow/prot…

立面设计模式–设计观点

在上一篇文章中,我们描述了适配器设计模式 。 在今天的文章中,我们将展示另一种类似的“四结构帮派”模式 。 顾名思义,结构模式用于从许多不同的对象形成更大的对象结构。 外观模式就是这样一种模式,它为系统内的一组接口提供了简…

Java第三次作业 1502 马 帅

《Java技术》第三次作业 (一)学习总结 1.书中对面向对象封装性的定义为:指把对象的属性和行为看成一个密不可分的整体,把不需要让外界知道的信息隐蔽起来。简单来说,就是定义的一些对象,只有在本类中才可以…

sass运算

sass具有运算的特性,可以对数值型的Value(如:数字、颜色、变量等)进行加减乘除四则运算。 请注意运算符前后请留一个空格,不然会出错。 scss.style css.style 本文转载于:猿2048https://www.mk2048.com/blog/blog.php?idiij12j&titles…

163 coremail_Icoremail企业邮箱

高速稳定iCoremail企业邮箱于国内外多个网络运营商的主干网数据中心放置邮件服务器,同时采用我司自主研发的Coremail电子邮件系统,从多方面保障了用户的流畅体验。安全可靠iCoremail企业邮箱使用欧洲最大的反病毒安全提供商的Sophos反病毒系列产品&#…

jquery-基础事件[下]

<script>$(function () {mouseover mouseout mouseenter mouseleave的区别$(div).mouseover(function () {$(this).css(background, red);}).mouseout(function () {$(this).css(background, green);});$(div).mouseenter(function () {$(this).css(background, red);}).…

JavaOne 2012:NetBeans.Next –未来路线图

我从Continental Ballroom 4和一个NetBeans主题&#xff08; 项目Easel &#xff09;到Continental Ballroom 5&#xff0c;走了必要的几个步骤&#xff0c;以查看另一个面向NetBeans的演示文稿&#xff1a;“ NetBeans.Next –未来路线图”。 Ashwin Rao发起了“羽毛之鸟”&am…

LeetCode day30

LeetCode day30 害&#xff0c;昨天和今天在搞数据结构的报告&#xff0c;后面应该也会把哈夫曼的大作业写上来。 今天认识认识贪心算法。(&#xff61;&#xff65;∀&#xff65;)&#xff89; 2697. 字典序最小回文串 给你一个由 小写英文字母 组成的字符串 s &#xff0c;…