上篇介绍了命令模式的理论知识,这里再写两个小例子,加深理解。
1、撤销命令,关键在于命令执行的时侯保存这个命令对象,这就是把操作封装成对象的好处。
//这个不变
public class Light {
public void off(){
System.out.println("off...");
}
public void on(){
System.out.println("on...");
}
}
//Command接口添加一个undo()
public interface Command {
public void execute();
public void undo();
}
public class LightOffCommand implements Command {
Light light;
public LightOffCommand(Light light){
this.light = light;
}
public void execute() {
light.off();
}
//在这里进行之前操作的逆操作,实现“撤销”
public void undo(){
light.on();
}
}
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light){
this.light = light;
}
public void execute() {
light.on();
}
public void undo(){
light.off();
}
}
public class RemoteControl {
Command c;
Command lastCommand;
public void setCommand(Command c){
this.c = c;
}
public void pressButton(){
c.execute();
//保存命令对象的引用
lastCommand = c;
}
public void undoPressButton(){
lastCommand.undo();
}
}
测试:
public class CommandLoader {
public static void main(String[] args) {
RemoteControl src = new RemoteControl();
Light light = new Light();
LightOnCommand lo = new LightOnCommand(light);
src.setCommand(lo);
//操作
src.pressButton();
System.out.println();
//撤销操作
src.undoPressButton();
}
}
输出:
on...
off...
这里模拟的是简单操作,实际上可能有针对Light状态值的操作,但实现原理是一样的。
2、宏命令:创建一个新类MacroCommand,封装多个命令,达到一次性执行多个命令的目的。
//此类与一般的具体命令是一个级别的
public class MacroCommand implements Command{
//保存多个命令对象
Command[] commands;
public MacroCommand(Command[] commands) {
this.commands = commands;
}
public void execute(){
for (Command c : commands) {
c.execute();
}
}
}
public class CommandLoader {
public static void main(String[] args) {
//遥控器
RemoteControl rc = new RemoteControl();
//三个命令
LightOnCommand lo = new LightOnCommand(new Light());
TvOnCommand to = new TvOnCommand(new Tv());
AirConditionOnCommand ao = new AirConditionOnCommand(new AirCondition());
Command[] cs = {lo,to,ao};
//宏命令
MacroCommand mc = new MacroCommand(cs);
rc.setCommand(mc);
rc.pressButton();
}
}
执行结果是:
on...
tv on...
air condition on...
分享到:
相关推荐
人脸识别神经网络,数据集为CelebA,基于Pytorch实现 采用彼此独立的40个卷积神经网络,可识别脸部40个特征。 包括: 5_o_Clock_Shadow:刚长出的双颊胡须 Arched_Eyebrows:柳叶眉 Attractive:吸引人的 ...
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统...
可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现...
非常好的设计模式介绍资料,通俗易懂,适用于编程人员参考。采用了大量图片介绍系统的展示了编程当中常用的各种模式设计
白话说电气_相电压和线电压的分析 白话说明 比较容易理解
白话说电气_电机制动的几种常见方式.pdf
深入浅出设计模式 pdf 深入浅出设计模式 中文版 设计模式 下载说明: 因个人上传资源大小只能是20M,而该书的PDF格式过大,所以只能分开上传。如有不便请谅解。【该书一共13章,在上传的时候我尽量按章节顺序打包...
# 1.原理理解 # 1.1 textrank原理见 Textrank.docx ## 1.2 代码见: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- ...from __future__ import absolute_import, unicode_literals ...
写在前面 分享一些设计模式的笔记。陆续整理,按照设计模式类型,创建型,结构型,行为型发布 博文会用通俗的话梳理一些自己的理解,结合开发中的实际场景, 理解不足小伙伴帮忙指正,虚心接受 ^_^ 傍晚时分
08 | 白话容器基础(四):重新认识Docker容器08 | 白话容器基础(四):重新认识Docker容器08 | 白话容器基础(四):重新认识Docker容
07 | 白话容器基础(三):深入理解容器镜像07 | 白话容器基础(三):深入理解容器镜像07 | 白话容器基础(三):深入理解容器镜像张磊 2018-09-
本科毕业设计_基于SpringBoot的医疗数据分析管理系统_前后端分离项目 各文件说明 BS_HIS 文件夹:是该项目的后端程序包 element-ui-test文件夹:是该项目的前端程序包 DecisionTreeModel.py :决策树预测模型 ...
我们对一个汽车评论的数据集利用深度学习的卷积神经网络进行特征提取然后进行情感分析。然后我们利用Python的Django框架将其包装成一个搜索引擎,输入相应的关键字进行搜索即可获取到相应结果。...
为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也有几个朋友给我点鼓励,给了star。本文工程...
紧接着,我详细介绍了容器技术圈在过去五年里的“风云变幻”,而通过这部分内容,我希望你能理解这样一个道理:05 | 白话容器基础(一):从进程说开去容器本身没有价
GPT2-Chinese-old_gpt_2:GPT2实现藏头诗生成,含训练好的模型,可以输入格律、风格和藏头字,自动生成藏头诗 bert2transformer_on_NMT:Bert实现翻译模型,含训练好的模型,输入文言文或者古诗词,会自动生成相应的...
08 白话容器基础(四):重新认识Docker容器.pdf
文件下载 已经训练好的facenet_mobilenet.h5和facenet_inception_resnetv1.h5可以在百度网盘下载。 ... 训练用的CASIA-WebFaces数据集以及评估用的LFW数据集可以在百度网盘下载。 ... 预测步骤 a、使用预训练权重 ...
说到这一点,相信你也能够知道我在上一篇文章最后给你留下的第一个思考题的答案了:在之前虚拟机与容器技术的对比图里,不应该把 Docker Engine 或者任何容
search_from_videos 基于Python的机器学习应用,针对监控视频完成行人轨迹搜索。通过一张目标图像,能自动从大量视频中搜索出包含目标的视频片段,并标记目标。 运行环境 Python 3.6.2 TensorFlow-GPU 1.6.0 ...