设计模式--命令模式
类图
源码
Command.java package com.demo; public interface Command { /** * 执行命令 */ void execute(); void redo(); /** * 撤销命令 */ void undo(); } Light.java package com.demo; public class Light { public void on() { System.out.println("灯亮了..."); } public void off() { System.out.println("灯暗了..."); } } LightOffCommand.java package com.demo; public class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light = light; } @Override public void execute() { light.off(); } @Override public void redo() { light.on(); } @Override public void undo() { light.on(); } } LightOnCommand.java package com.demo; public class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } @Override public void redo() { light.off(); } @Override public void undo() { light.off(); } } NoCommand.java package com.demo; public class NoCommand implements Command { @Override public void execute() { // TODO 自动生成的方法存根 } @Override public void redo() { // TODO 自动生成的方法存根 } @Override public void undo() { // TODO 自动生成的方法存根 } } RemoteInvoker.java package com.demo; public class RemoteInvoker { /** * 开关命令数组,模拟有很多对开关数组 */ private Command[] onCommands; private Command[] offCommands; /** * 撤销(回退)命令 */ private Command undoCommand; private Command redoCommand; public RemoteInvoker(int length) { // 有几组开关,就设置多少数组 onCommands = new Command[length]; offCommands = new Command[length]; // 把每个命令初始化成空命令,避免空指针异常 Command noCommand = new NoCommand(); undoCommand = noCommand; redoCommand = noCommand; for (int i = 0; i < length; i++) { onCommands[i] = noCommand; offCommands[i] = noCommand; } } public void setCommond(int slot, Command onCommand, Command offCommand) { onCommands[slot] = onCommand; offCommands[slot] = offCommand; } public void onButton(int slot) { onCommands[slot].execute(); //为撤销(回退)按钮记录动作 undoCommand = onCommands[slot]; redoCommand = onCommands[slot]; } public void offButton(int slot) { offCommands[slot].execute(); //为撤销(回退)按钮记录动作 undoCommand = offCommands[slot]; redoCommand = onCommands[slot]; } public void undoButton() { undoCommand.undo(); } public void redoButton() { // TODO 自动生成的方法存根 redoCommand.redo(); } } Client.java package com.demo; public class Client { public static void main(String[] args) { // 1、创建接收者 Light light = new Light(); // 2、创建命令对象 LightOnCommand lightOnCommand = new LightOnCommand(light); LightOffCommand lightOffCommand = new LightOffCommand(light); // 3、创建一组开关并用命令对象装载它 RemoteInvoker invoker = new RemoteInvoker(1); invoker.setCommond(0, lightOnCommand, lightOffCommand); // 4、测试 invoker.onButton(0); invoker.offButton(0); System.out.println("撤销命令"); invoker.undoButton(); System.out.println("重做命令"); invoker.redoButton(); } }
测试截图
__EOF__

本文作者:往心。
本文链接:https://www.cnblogs.com/lx06/p/15688528.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/lx06/p/15688528.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
2020-12-14 jsp标签问题