行为模式(模板模式命令模式备忘录模式)
目录
模板方法模式(Template)
介绍
实现
命令模式(Command)
介绍
实现
备忘录模式(Memento)
介绍
实现
模板方法模式(Template)
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式
介绍
介绍
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项:1,为防止恶意操作,一般模板方法都加上 final 关键词。
2,钩子函数在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
3,算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
应用:Spring IOC容器加载
实现
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。
命令模式(Command)
请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
介绍
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
如何解决:通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。
注意事项:1,系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
2,发起请求的对象与执行请求的对象解耦 容易实现对请求的撤销和重做 空命令也是一种设计模式,它为我们省去了判空的操作
3, 命令模式不足: 可能导致某些系统有过多的具体命令类,增加了系统的复杂度
与外观模式相似:都是将多个功能聚合在一起 外观模式更多适用于维护;命令模式更多应用于设计;
应用:Spring框架中的JdbcTemplate类 容易设计一个命令队列。只要把命令对象放到列队,就可以多线程的执行命令 界面的一个按钮都是一条命令、模拟 CMD(DOS 命令)订单的撤销/恢复、触发- 反馈机制
实现
我们首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。
Broker 对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo 类使用 Broker 类来演示命令模式。
备忘录模式(Memento)
保存一个对象的某个状态,以便在适当的时候恢复对象
介绍
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决:通过一个备忘录类专门存储对象状态。
关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。
应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctrl + z。 4、IE 中的后退。 5、数据库的事务管理。
优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。
注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。3,给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。4,实现了信息的封装,使得用户不需要关心状态的保存细节
注意:如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
应用:事务回滚,游戏的存档,Selenium动态解析资源树
实现
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。
行为模式(模板模式命令模式备忘录模式)相关推荐
- 设计模式(模板模式,命令模式,备忘录模式)
目录 模板模式 什么是模板模式? 术语? 什么时候使用模板模式? 模板模式的优点? 模板模式的缺点? 角色? 钩子函数? 注意事项和细节? 什么场景使用模板模式? 案例: 命令模式 什么是命令模式? ...
- 《JAVA与模式》之备忘录模式
备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一 ...
- Java描述设计模式(24):备忘录模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...
- 《设计模式详解》行为型模式 - 备忘录模式
备忘录模式 6.10 备忘录模式 6.10.1 概述 6.10.2 结构 6.10.3 案例实现 "白箱" 备忘录模式 "黑箱" 备忘录模式 6.10.4 优缺 ...
- java备忘录模式应用场景_Java描述设计模式(24):备忘录模式
一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放.下面基于备忘录设计模式来 ...
- 43 备忘录模式(详解版)
行为型模式: 模板方法(Template Method)模式.策略(Strategy)模式.命令(Command)模式.职责链(Chain of Responsibility)模式.状态(State) ...
- 行为型模式——备忘录模式(Memento Pattern)
文章目录 备忘录模式(Memento Pattern) 什么是备忘录模式? UML 角色 应用 使用模板 为什么要使用备忘录模式? 优点: 缺点: 怎样使用备忘录模式? 在JDK中的使用 备忘录模式( ...
- 每天一个设计模式之备忘录模式(Memento Pattern)
顾名思义,备忘录就是保存一个状态,到需要的时候可以恢复到某一时刻的状态. 一.UML类图 参与者说明 Originator,需要保存状态的对象: Memento,备忘录对象,负责保存记录(即Origi ...
- 备忘录模式及其实现场景
备忘录模式(Memento Design Pattern),也叫快照(Snapshot)模式.指在不违背封装原则前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态 ...
- java备忘录模式 类图,【java设计模式】备忘录模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...
最新文章
- ABP-JavaScript API
- 领域驱动设计案例:Tiny Library:领域模型
- 独立成分分析ICA系列1:意义
- TSP - 状态压缩dp
- 网关和路由器的区别是什么?
- SDNU 1019.礼物(水题)
- 什么是类加载器?类加载器有哪些
- JSP JAVA 自定义 错误页面(404,505,500)
- 【Docker 命令】- images命令
- linux puppy 安装软件,小芭比linux下载
- 电脑各种故障排除集锦
- iOS 一个功能很全的视频播放器
- linux 下通过 httpd服务创建网页
- 今日睡眠质量记录79
- K8s 集群节点在线率达到 99.9% 以上,扩容效率提升 50%,我们做了这 3 个深度改造...
- 2017年3月18日奇虎360 笔试真题(3个编程题)
- sql左连接出现重复数据
- c++游戏编程三国杀
- 计算机的冷启动与热启动
- 2015年多校训练总结
热门文章
- 根据入栈顺序判断出栈顺序的合法性
- 将音频转化为MP3格式(lame库)
- JedisConnectionException: Could not get a resource from the pool
- 罗克韦尔Rockwell Automation EDI 项目
- 计算机网络安全的脆弱性,网络安全及网络安全评估的脆弱性分析
- QuickBooks 2020 for Mac(mac财务管理软件)
- 关于理性形象的塑造——歇洛克·福尔摩斯眼中的世界
- 《JUC并发编程 - 高级篇》03 - 共享对象之管程 下篇(Monitor | waitnotify | ParkUnpark | 线程状态转换 | 活跃性 | ReentrantLock)
- 走对路!在智能时代别捡了芝麻丢了西瓜!
- mysql进阶:企业数据库安全防护方案