博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java设计模式学习(五):命令模式
阅读量:5265 次
发布时间:2019-06-14

本文共 2452 字,大约阅读时间需要 8 分钟。

   命令模式:就是将将发出请求的对象和执行请求的对象解耦,被解耦的两者之间通过命令对象进行沟通。可以理解为:我们开关灯,不用和灯打交道,我们和开关沟通就可以了,不需要知道具体的实现过程。

   不同的对象,对应着不同的命令,所以为了方便扩展,先建立一个接口:

public interface Command {    public void excute();    public void undo();}
被调用对象:

public class Receiver {            private String description;                public Receiver(String description) {           this.description=description;        }                public String getDescription() {            return description;        }            public void action(){            System.out.println("Receiver 已执行...");        }                public void noAction(){            System.out.println("Receiver 执行已撤销");        }    }
实现command接口

public class MyCommandImpl implements Command{    Receiver receiver;        public MyCommandImpl(Receiver receiver) {        this.receiver=receiver;    }        @Override    public void excute() {        receiver.action();    }    @Override    public void undo() {        receiver.noAction();    }}
现在需要一个调用者:

public class Invoker {    Command[] commands;//持有多个命令    Command undoCommand; //撤销命令    public Invoker(int size) {       commands=new Command[size];       Command empty=new NoCommand();//空对象,不执行任何动作       for(int i=0;i
测试:

public class Client {    public static void main(String[] args) {        Invoker invoker=new Invoker(1);//调用者                Receiver receiver=new Receiver("door");                MyCommandImpl commandImpl=new MyCommandImpl(receiver);                invoker.setCommand(0, commandImpl)                invoker.invokeCommand(0);        invoker.undoCommand();    }}
修改一下,我们可以一次执行一组命令:

public class MacroCommand implements Command {    Command[] commands;        public MacroCommand(Command[] commands) {        this.commands=commands;    }        @Override    public void excute() {        for(int i=0;i
=0;i--){ commands[i].undo(); } }}
测试:

public class Client {    public static void main(String[] args) {        Invoker invoker=new Invoker(1);//调用者                Receiver receiver=new Receiver("door");                MyCommandImpl commandImpl=new MyCommandImpl(receiver);                Command[] commands={commandImpl,commandImpl,commandImpl,commandImpl,commandImpl};                MacroCommand macroCommand=new MacroCommand(commands);                invoker.setCommand(0, macroCommand);                invoker.invokeCommand(0);        invoker.undoCommand();    }}

转载于:https://www.cnblogs.com/re-myself/p/5532489.html

你可能感兴趣的文章
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
Leetcode Balanced Binary Tree
查看>>
go:channel(未完)
查看>>
[JS]递归对象或数组
查看>>
LeetCode(17) - Letter Combinations of a Phone Number
查看>>
路由器外接硬盘做nas可行吗?
查看>>
python:从迭代器,到生成器,再到协程的示例代码
查看>>