[design pattern](8) Command
前言
在前面的章节中,我们介绍了单例模式,它是创建型模式的一员。今天我们来介绍一下命令模式,它是行为型模式的一员。
思考题
首先,让我们来思考下面的问题:
话说有一家遥控器公司,他想制作一款很牛逼的遥控器。这个遥控器可以控制家里所有的电器,为了简单一点,假设所有的用户家里只有电视机和电灯两种电器。那么如果是你,你会怎么实现这个遥控器呢?
由于电视机和电灯是两个不同的厂商生产的产品,所以他们的打开方式是不一样的。首先让我们来看一看这两个类的定义:
Television.java:
public class Television {
public void open() {
System.out.println("打开电视");
}
public void close() {
System.out.println("关闭电视");
}
}
ElectricLight.java:
public class ElectricLight {
public void on() {
System.out.println("打开电灯");
}
public void off() {
System.out.println("关闭电灯");
}
}
让我们来看下下面的设计:
RemoteControl.java:
public class RemoteControl {
private String product;
public void setProduct(String product) {
this.product = product;
}
public void execute() {
switch (product) {
case "Television":
new Television().open();
break;
case "ElectricLight":
new ElectricLight().on();
break;
default:
}
}
}
这个遥控器太棒了,我可以用它来控制家里的电视机和电灯,再也不用到处翻找遥控器了。要是它还可以控制洗衣机那就更棒了。那么如果再在遥控器里添加一个洗衣机需要怎么做,哦,太糟糕了,我还需要把遥控器拆开,然后把洗衣机的命令添加进去,好痛苦有么有,那么有么有一种设计可以不对遥控器进行更改,就可以添加其他的家电呢。这个时候命令模式就可以发挥它的作用了。
命令模式
定义:将请求封装成对象,从而可以使用不同的请求将客户参数化,使得请求发送者和请求接受者之间互相隔离。
类图:

上面涉及到的角色有4个:
- 抽象命令:将命令封装成一个接口,每个接收者都需要实现一个相应的命令接口。
- 具体命令:实现了抽象命令类的方法,并且调用了具体接受者的方法。
- 请求接受者:具体要执行操作的类。
- 请求发送者:将命令对象传递给具体的接受者,执行相应的操作。
思考题实现
首先,定义一个抽象命令类:
Command.java:
public interface Command {
void execute();
}
然后,实现抽象命令类:
TelevisionCommand.java:
public class TelevisionCommand implements Command {
private Television television = new Television();
@Override
public void execute() {
television.open();
}
}
ElectricLightCommand.java:
public class ElectricLightCommand implements Command {
private ElectricLight electricLight = new ElectricLight();
@Override
public void execute() {
electricLight.on();
}
}
然后,实现一个遥控器:
RemoteControl.java:
public class RemoteControl {
private Command command;
public void execute() {
command.execute();
}
public void initCommand(Command command) {
this.command = command;
}
}
测试类:
Custom.java:
public class Custom {
public static void main(String ...args) {
RemoteControl remoteControl = new RemoteControl();
remoteControl.initCommand(new TelevisionCommand());
remoteControl.execute();
remoteControl.initCommand(new ElectricLightCommand());
remoteControl.execute();
}
}
[design pattern](8) Command的更多相关文章
- [Design Pattern] Command Pattern 命令模式
发现公司的代码好像有用到 Command Pattern,回顾重温下. Command Pattern 的类图结构如下: 参考 <Head First Design Patterns(英文版)& ...
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- 设计模式(Design Pattern)系列之.NET专题
最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...
- [转]Design Pattern Interview Questions - Part 4
Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...
- [转]Design Pattern Interview Questions - Part 1
Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...
- C++ Design Pattern: What is a Design Pattern?
Q: What is a Design Pattern? A: Design Patterns represent solutions to problems what arise when deve ...
- Design Pattern in Simple Examples
Instead of defining what is design pattern lets define what we mean by design and what we mean by pa ...
- java设计模式大全 Design pattern samples in Java(最经典最全的资料)
java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...
- Design Principle vs Design Pattern 设计原则 vs 设计模式
Design Principle vs Design Pattern设计原则 vs 设计模式 来源:https://www.tutorialsteacher.com/articles/differen ...
随机推荐
- Spring(七)--Spring JDBC
Spring JDBC 1.需要的实体类和数据库 2.需要的dao层 package com.xdf.dao; import com.xdf.bean.Student; import org.spri ...
- 《剑指offer》面试题6 重建二叉树 Java版
(由一个二叉树的前序和中序序列重建一颗二叉树) 书中方法:我们要重建一棵二叉树,就要不断地找到根节点和根节点的左子结点和右子节点.注意前序序列, 它的第一个元素就是二叉树的根节点,后面的元素分为它的左 ...
- py3 base64加密
import base64 #字符串编码: encodestr = base64.b64encode('abcr34r344r'.encode('utf-8')) print(str(encodest ...
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- 断言(assert)
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言. 简单点说,断言指的就是,将结果判断说 ...
- CF528E Triangles 3000
cf luogu 既然要求三角形面积,不如考虑三角形的面积公式.因为是三条直线,所以可以考虑利用三个交点来算面积,如果这个三角形按照逆时针方向有\(ABC\)三点,那么他的面积为\(\frac{\ve ...
- 运维ipvsadm配置负载均衡
一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...
- 处理webp加所有的jpg到指定路径
#!/bin/shfunction getdir(){compareName='.webp';for element in `ls $1`dodir_or_file=$1"/"$e ...
- 十三、LaTex中的参考文献BibTex
将默认文献工具设置为bibtex
- Maven项目构建利器01——为什么要使用Maven
1.为什么要使用Maven a)一个项目就是一个工程 如果一个项目非常庞大,不适合用package(包)来划分模块, 最好是每一个模块对应一个工程 分工合作,借助于Maven就可以将一个项目拆分成多个 ...