命令模式
来源:互联网 发布:中邮网络培训学院官网 编辑:程序博客网 时间:2024/06/06 09:19
高度概括
将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
概述
在许多设计中,经常涉及到一个对象请求另一个对象调用其方法达到某种目的,如果请求者不希望或无法与被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。
命令模式的核心就是使用命令对象封装方法调用,即将被请求者的引用封装到命令对象中,这样一来,当请求者需要完成某项任务时,只需与命令对象打交道,即让命令对象调用那个封装了被请求者执行请求的那个方法。
命令模式中包括四种角色
接收者(Receiver):接收者是一个类的实例 该实例负责执行与请求相关的操作。
命令接口(Commond):规定了用来封装”请求”的若干个方法。
具体命令(ConcreteCommand):具体命令是实现命令接口的类的实例。具体命令必须实现命令中的方法。
请求者(Invoker) : 请求者是一个包含了command接口变量的类的实例。请求者中的Command接口的变量可以存放任何具体命令的引用。请求者负责用具体命令,让具体命令执行那些封装了”请求”的方法。
优点
- 降低对象之间的耦合度。
- 满足”开-闭原则”,新的命令可以很容易地加入到系统中。
- 可以将具体命令保存到持久化的媒介中,在需要时可以再次执行 则使用命令模式可以记录日志
- 可以将请求进行排队 每个请求对应一个具体命令 则可以按一定顺序执行这些具体命令
缺点
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
适用场景
- 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
- 系统需要在不同的时间指定请求、将请求排队和执行请求。
- 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
- 系统需要将一组操作组合在一起,即支持宏命令。
应用
按主人对小狗的命令 如坐下,捡球,
Command.java
public interface Command { public abstract void execute();}
Dog.java
public class Dog { private String name; Dog(String name){ this.setName(name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public void doSitDown() { System.out.println(this.getName() + "坐下了"); } public void doSearchBall(){ System.out.println(this.getName() + "去捡球了"); }}
DogCommand.java
public class DogCommand implements Command{ Dog dog; DogCommand(Dog dog){ this.dog = dog; } @Override public void execute() { // TODO Auto-generated method stub dog.doSitDown(); dog.doSearchBall(); }}
Master.java
public class Master { private Command command; public void setCommand(Command command){ this.command = command; } public void startCommand(){ command.execute(); }}
Test.java
public class Test {public static void main(String [] args){ Dog dog = new Dog("Tom"); Command command = new DogCommand(dog); Master m = new Master(); m.setCommand(command); m.startCommand(); }}
测试结果为:
Tom坐下了
Tom去捡球了
总结:
- 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
- .命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
- 命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
本人还是初学者 如有错误,希望大家指出 多多交流
参考:http://blog.csdn.net/jason0539
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 安卓对HTML的处理
- ChatGirl is an AI ChatBot based on TensorFlow Seq2Seq Model.
- 瀑布流实现的三种方法js jq css3
- 用Javascript实现Trie树的代码(即前缀树)
- Android Gradle实用技巧(一) | 隐藏Android签名文件和密钥信息
- 命令模式
- 如何卸载已安装的NiceLabel 2017
- 数据结构 排序
- LCS模板
- 侧边栏使用
- android LeakCanary检测内存泄漏
- css3 文字动画效果
- 面试中常问的排序算法
- 使用 Intellij Idea 导出JavaDoc