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 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
随机推荐
- MongodDB用GridFS方式存取文件
在实现GridFS方式前我先讲讲它的原理,为什么可以存大文件.驱动首先会在当前数据库创建两个集合:"fs.files"和"fs.chunks"集合,前者记录了文 ...
- python spark kmeans demo
官方的demo from numpy import array from math import sqrt from pyspark import SparkContext from pyspark. ...
- 33.Qt模型与视图
#include "mainwindow.h" #include <QApplication> #include <QAbstractItemModel> ...
- 完整注册+JQuery验证+selert后台校验
Java代码 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...
- ROS-参数
前言:参数的用法. 一.参数常用命令 命令 功能 rosparam list 参数列表 rosparam get 获取参数 rosparam set 设置参数 rosparam load 加载参数 ...
- 看似简单!解读C#程序员最易犯的7大错误
编程时犯错是必然的,即使是一个很小的错误也可能会导致昂贵的代价,聪明的人善于从错误中汲取教训,尽量不再重复犯错,在这篇文章中,我将重点介绍C#开发人员最容易犯的7个错误. 格式化字符串 在C#编程中, ...
- Hua Wei 机试题目三---2014
一.根据对应规则进行翻译输出 描述:已知有如下的对应规则: ,则输入任意个正整数,输出经过规则翻译以后对应的结果. 例如:输入:1234:输出bcde. 题目很简单,我觉得需要注意的问题就是对于大整数 ...
- 浅谈SpringCloud (三) Ribbon负载均衡
什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...
- input输入框只允许输入数字
/* input输入框只允许输入数字*/ <input type="text" onkeypress="keyPress()" > function ...
- Long型转换成IP段String、StringIP段转换成Long型
/** 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx * * @param ip * @return */ public static String getIpFromLong(Lon ...