中介者模式(Mediator Pattern)

定义:用一个中介对象来封装一系列的对象交互。
中介者模式的组成部分:
1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
2) 具体中介者(Concrete Mediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3) 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。
使用中介者模式后,每一个对象都会在自己的状态发生改变时候,告诉中介者,每一个对象都会对中介者所发出的请求作为回应。将对象之间彼此解耦。
中介者使不同对象不用再显式地相互引用,从而降低了它的耦合,而且可以独立地改变它们之间的交互。换句话说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖。
Mediator中介者模式,当多个对象彼此间都有联系的时候,我们就可以应用Mediator将对象间的多对多关系转换为一对多的关系,这样做,可以使各个对象间的耦合松散。统一管理对象间的交互。但也可能使得Mediator对象成为一个系统中的庞然大物,难以维护
使用场景:集中负责维护对象模型的关系完整性以及需要装对象间交互方式的时候.
其实MVC中的controller就是一种Mediator,是UI层 和后端应用sevice层间的中介者。中介者将交互的复杂性变为中介者的复杂性。

备忘录模式(MementoPattern)

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
    当你需要让对象返回到之前的状态的时候,就可以使用该模式了,在命令模式的时候,它的命令角色可以实现undo、redo的功能。从定义可以看出备忘录模式是专门来存放对象历史状态的,这对于很好的实现undo、redo功能有很大的帮助。所以在命令模式中undo、redo功能可以配合备忘录模式来实现。
备忘录模式所涉及的角色有三个:
备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。
备忘录(Memento)角色
备忘录角色又如下责任:
(1)将发起人(Originator)对象的内部状态存储起来。备忘录可以根据发起人对象的判断来决定存储多少发起人(Originator)对象的内部状态。
(2)备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。
备忘录有两个等效的接口:
窄接口:负责人对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄接口(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象。
宽接口:发起人对象可以看到一个宽接口(wide interface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复这个发起人对象的内部状态。
发起人(Originator)角色
发起人角色有如下责任:
(1)创建一个含有当前的内部状态的备忘录对象。
(2)使用备忘录对象存储其内部状态。
负责人(Caretaker)角色
负责人角色有如下责任:
(1)负责保存备忘录对象。
(2)不检查备忘录对象的内容。

原型模式(Prototype Pattern)
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
当创建给定类的实例的过程很昂贵或者很复杂的时候,就可以使用该模式了,在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象的时候,可以考虑该原型。
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

使用: 因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现可以利用这个方法来实现。.
 复制分为两种复制:
浅复制:复制了值类型对象,对于引用类型对象,只复制了引用,它指向原来引用的对象。Java中clone为浅复制。 
深复制:对值类型和引用类型的对象都生成一份新的拷贝. Java中可通过串行化来进行深复制,前提是对象以及对象内部所引用的对象都是可串行化的,否则要考虑将那些不可串行化的对象可否设为transient,排除在复制过程之外。
访问者模式(Visitor Pattern)
定义:表示一个作用于某对象结构中的各元素的操作。、
         当你想要为一个对象的组合增加新的行为,且封装并不重要的时候,可以使用。
       访问者模式,顾名思义使用了这个模式后就可以在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。从定义可以看出结构对象是使用访问者模式必须条件,而且这个结构对象必须存在遍历自身各个对象的方法。
访问者模式的组成结构:
1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
4) 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。
5) 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
一般来说,我们要对将要进行访问的对象组合添加一个方法,从而能够让访问者来访问,

转载于:https://blog.51cto.com/computerdragon/1178955

设计模式之中介者备忘录原型访问者相关推荐

  1. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  2. 【每天一个java设计模式(二十三)】 - 访问者模式

    在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者 ...

  3. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  4. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  5. 设计模式学习笔记九:原型模式(Prototype Pattern)

    1.概述     意图:我们将已经存在的对象作为原型,用户可以通过复制这些原型创建新的对象.     使用场合:当一个系统应该独立于产品的创建.构造和表示时,可以使用原型模式.在原型模式中,产品的创建 ...

  6. 设计模式(中介者模式-对象去耦)

    声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时 ...

  7. 设计模式学习笔记--Memento 备忘录模式

    在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现.      如何实现 ...

  8. 设计模式 行为型模式 -- 备忘录模式 具体实例:游戏挑战BOSS

    01:设计模式 行为型模式 – 备忘录模式(定义.结构.优缺点 适用场景分析) 02:设计模式 行为型模式 – 备忘录模式 具体实例:游戏挑战BOSS 03:设计模式 行为型模式 实例 – 备忘录模式 ...

  9. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  10. 理解原型设计模式以及JavaScript中的原型规则

    原型规则 原型规则 所有的引用类型(数组.对象.函数),都具有对象特征,即可自由扩展属性: var arr = []; arr.a =1; 所有的引用类型都有对象的特性,即可自由扩展 所有的引用类型都 ...

最新文章

  1. uniapp自定义顶部导航组件
  2. Redis专题-底层数据结构与使用场景
  3. 计划订单号码范围用完导致MRP无法运行
  4. 对struts一点理解总结
  5. Git show-branch显示提交信息
  6. vc 6.0 显示文件全路径_配送路径规划思考(十二)
  7. Linux 中显示所有正在运行的进程
  8. Leetcode打卡 | No.24 两两交换链表中的节点
  9. C++数字与字符串的相互转换
  10. 临时号码,接收短信验证码
  11. Snap7 西门子S7系列PLC的通信库 简介
  12. 修复:Linux系统机箱前置面板耳机插孔没声音
  13. 华为最美小姐姐,被外派墨西哥后...
  14. [NOI2015]小园丁与老司机,洛谷P2304,恶心的建图+有源汇上下界最小流
  15. java ee页面间怎么传值_jsp页面间常见的几种传值方式
  16. echart水滴_用echarts实现水滴图效果
  17. 《Total Commander:万能文件管理器》——12.6. 附录
  18. P5638 【CSGRound2】光骓者的荣耀
  19. 【书籍】——机器学习与深度学习
  20. v-model双向数据绑定

热门文章

  1. 【机器学习、神经网络】拟合非线性函数y = x**2 - 2(部分问题未解决)
  2. 【LeetCode】【数组】题号:*289,生命游戏
  3. 【python简洁之道】-----1. 注释规则
  4. opencv中Mat的数学运算和基本操作
  5. php app()路由,谷歌云应用引擎app.yaml php72与路由问题
  6. 关于 printf(%*.*s/n,m,n,ch) 的问题
  7. mysql 数据库编码怎么看_mysql查看数据库编码
  8. 当你成为大龄码农时,你会怎么找你的出路?
  9. 性能测试--jmeter中正则表达式提取器的使用【16】
  10. php远程调试 没有光标,老法师谈技术 - PHP远程单步调试