JAVA设计模式之【命令模式】
命令模式
为了降低耦合度,将请求的发送者和接收者解耦
发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求
对请求排队
记录请求日志
支持撤销操作
核心在于引入命令类
角色
抽象命令类Command
具体命令类ConcreteCommand
调用者Invoker
接收者Receiver
请求的一方不必知道接收请求的一方,更不必知道请求如何被接收、执行、怎么执行、何时执行
看例子,电视遥控器,电视,人。
1.抽象命令类,或接口
package Command;
/**
 * Created by Jiqing on 2016/10/26.
 */
public interface AbstractCommand {
    public void execute();
}
2.命令接收者电视机
package Command;
/**
 * Created by Jiqing on 2016/10/26.
 */
public class Television {
    public void open() {
        System.out.println("打开电视机");
    }
    public void close() {
        System.out.println("关闭电视机");
    }
    public void changeChannel() {
        System.out.println("切换电视频道");
    }
}
3.具体命令
a.打开命令
package Command;
/**
 * Created by Jiqing on 2016/10/26.
 */
public class TVOpenCommand implements AbstractCommand{
    private Television tv;
    public TVOpenCommand() {
        tv = new Television();
    }
    public void execute() {
        tv.open();
    }
}
b.关闭命令
package Command;
/**
 * Created by Jiqing on 2016/10/26.
 */
public class TVCloseCommand implements AbstractCommand{
    private Television tv;
    public TVCloseCommand() {
        tv = new Television();
    }
    public void execute() {
        tv.close();
    }
}
c.更改频道命令
package Command;
/**
 * Created by Jiqing on 2016/10/26.
 */
public class TVChangeCommand implements AbstractCommand{
    private Television tv;
    public TVChangeCommand() {
        tv = new Television();
    }
    public void execute() {
        tv.changeChannel();
    }
}
4.命令发布者控制者,人
package Command;
/**
 * Created by Jiqing on 2016/10/26.
 */
public class Controller {
    private AbstractCommand openCommand,closeCommand,changeCommand;
    public Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand) {
        this.openCommand = openCommand;
        this.closeCommand = closeCommand;
        this.changeCommand = changeCommand;
    }
    public void open() {
        openCommand.execute();
    }
    public void change() {
        changeCommand.execute();
    }
    public void close() {
        closeCommand.execute();
    }
}
5.客户端
package Command;
/**
 * Created by Jiqing on 2016/10/26.
 */
public class Client {
    public static void main(String a[]) {
        AbstractCommand openCommand,closeCommand,changeCommand;
        openCommand = new TVOpenCommand();
        closeCommand = new TVCloseCommand();
        changeCommand = new TVChangeCommand();
        Controller control = new Controller(openCommand,closeCommand,changeCommand);
        control.open();
        control.close();
        control.change();
    }
}
执行结果:
打开电视机
关闭电视机
切换电视频道
再看一个撤销案例
package Command.Undo;
abstract class AbstractCommand
{
    public abstract int execute(int value);
    public abstract int undo();
}
class ConcreteCommand extends AbstractCommand
{
    private Adder adder = new Adder();
    private int value;
    public int execute(int value)
    {
        this.value=value;
        return adder.add(value);
    }
    public int undo()
    {
        return adder.add(-value);
    }
}
class CalculatorForm
{
    private AbstractCommand command;
    public void setCommand(AbstractCommand command)
    {
        this.command=command;
    }
    public void compute(int value)
    {
        int i = command.execute(value);
        System.out.println("执行运算,运算结果为:" + i);
    }
    public void undo()
    {
        int i = command.undo();
        System.out.println("执行撤销,运算结果为:" + i);
    }
}
class Adder
{
    private int num=0;
    public int add(int value)
    {
        num+=value;
        return num;
    }
}
class Client
{
    public static void main(String args[])
    {
        CalculatorForm form = new CalculatorForm();
        ConcreteCommand command = new ConcreteCommand();
        form.setCommand(command);
        form.compute(10);
        form.compute(5);
        form.compute(10);
        form.undo();
    }
}
执行结果:
执行运算,运算结果为:10
执行运算,运算结果为:15
执行运算,运算结果为:25
执行撤销,运算结果为:15
看类图


JAVA设计模式之【命令模式】的更多相关文章
- 折腾Java设计模式之命令模式
		博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ... 
- Java设计模式 之 命令模式
		1 从属模式分类 行为性模式 2 命令模式意图 命令模式可将动作的请求者和动作的执行者对象中解耦. 该模式将一个行为操作发起者的请求封装到对象中,该请求由另外一个对象执行. 将动作 ... 
- JAVA设计模式之 命令模式【Command Pattern】
		一.概述 命令模式能够将请求发送者和接收者全然解耦.发送者与接收者之间没有直接引用关系,发送请求的对象仅仅须要知道怎样发送请求,而不必知道怎样完毕请求.核心在于引入了命令类,通过命令类来减少发送者和接 ... 
- 14.java设计模式之命令模式
		基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ... 
- java设计模式之命令模式
		学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习 ... 
- java设计模式之命令模式以及在java中作用
		命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请 ... 
- 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式
		目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ... 
- 用Java 8 Lambda表达式实现设计模式:命令模式
		在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ... 
- 折腾Java设计模式之状态模式
		原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ... 
- Java设计模式——装饰者模式
		JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ... 
随机推荐
- NFS的搭建(sudo apt-get install nfs-kernel-server),TFTP服务器(sudo apt-get install tftpd-hpa tftp-hpa)
			版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Osean_li/article/details/53240705 ***************** ... 
- h5-列表
			aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAX4AAAInCAIAAAAQ0aUJAAAgAElEQVR4nOy9eVxb153wnZk+z/t53n ... 
- poj--3207--Ikki's Story IV - Panda's Trick(2-sat)
			Ikki's Story IV - Panda's Trick Time Limit: 1000MS Memory Limit: 131072KB 64bit IO Format: %I64d ... 
- webstorm配置Monokai-Sublime.jar主题
			https://github.com/OtaK/jetbrains-monokai-sublime 导入下载的Monokai-Sublime.jar jar包即可使用. 
- 8. String to Integer[M]字符串转整数
			题目 Inplement atoi which converts a string to an integer. The function first discards as many whitesp ... 
- Spring mvc 实现jsonp和json数据类型
			在使用springmvc开发rest接口的时候很方便,可以直接使用@ResponseBody注解,直接加在springmvc的控制器类的方法上,springmvc会直接为我们将返回的对 ... 
- ffmpeg x264编译与使用介绍
			问题1:我用的是最新版本的ffmpeg和x264,刚刚编译出来,编译没有问题,但是在linux 环境使用ffmpeg的库时发现报错error C3861: 'UINT64_C': identifier ... 
- Oracle PL/SQL开发基础(第三十三弹:EXCEPTION_INIT)
			如果有一些异常并没有异常名称,比如一些ORA-开头的异常并没有一个友好的预定义的异常定义,此时在WHEN子句中无法使用具体的异常名称,必须要使用OTHERS异常处理器进行捕捉.通过EXCEPTION_ ... 
- ScSPM & LLC
			为啥会有SPM→ScSPM呢?原因之一是为了寻找better coding + better pooling的方式提高性能,原因之二就是提高速度.如何提高速度?这里的速度,不是Coding+Pooli ... 
- Reflection (computer programming) -反射-自身结构信息
			n computer science, reflection is the ability of a computer program to examine, introspect, and modi ... 
