JAVA设计模式之:命令模式
*通常情况下:行为请求者与实现者通常呈现一种高度耦合状态。有时要对行为进行变更处理处理。高度耦合方式就显得不合适。
* 将行为请求者与行为实现者解耦,将一组行为抽象为对象。实现二者之间的松耦合。
这就是命令模式(Command Pattern)。
* 命令模式通常由这几部分组成:命令接口,详细命令(实现命令接口),接受命令的对像,命令控制器等组成。
* 模式的优势:
1.减少对象之间的耦合度。
2.新的命令能够非常easy地增加到系统中及设计一个组合命令。
4.实现调用同样方法来实现不同的功能。
模式的不足之处:
每个命令都要设计一个详细的类,命令较多的话,会导致类比較多,系统变得庞大,命令模式的使用效率可能减少。
/**
* 运行命令的接口
* @description:
* @date 2016-1-19 上午10:26:04
*/
public interface OrderImpl {
void execute();//运行方法
}
/**
* 详细的命令:开空调命令
* @description:
* @date 2016-1-19 上午10:28:18
*/
public class OnOrder implements OrderImpl {
private AirCondition air;
public OnOrder(AirCondition light) {
this.air = light;
}
@Override
public void execute() {
air.open();
}
}
/**
* 详细的命令:关空调命令
* @description:
* @author ldm
* @date 2016-1-19 上午10:28:51
*/
public class OffOrder implements OrderImpl {
private AirCondition light;
public OffOrder(AirCondition light) {
this.light = light;
}
@Override
public void execute() {
light.close();
}
}
/**
* 详细命令:调节风速
* @description:
* @date 2016-1-19 上午11:04:50
*/
public class ChangeSpeedOrder implements OrderImpl {
private AirCondition myTv;
private int channel;
public ChangeSpeedOrder(AirCondition tv, int channel) {
myTv = tv;
this.channel = channel;
}
public void execute() {
myTv.updateWind(channel);
}
}
/**
* 命令控制器。相当于是遥控器:控制空调的开关。调节风速等
* @description:
* @date 2016-1-19 上午10:57:43
*/
public class Control {
private OrderImpl onOrder; // 开
private OrderImpl offOrder;// 关
private OrderImpl updateChannel;// 调节风速
public Control(OrderImpl onOrder, OrderImpl offOrder, OrderImpl updateChannel) {
this.onOrder = onOrder;
this.offOrder = offOrder;
this.updateChannel = updateChannel;
}
public void turnOn() {
onOrder.execute();
}
public void turnOff() {
offOrder.execute();
}
public void changeChannel() {
updateChannel.execute();
}
}
/**
* 命令接收者:空调为例
* @description:
* @date 2016-1-19 上午10:52:38
*/
public class AirCondition {
public int currentChannel = 0;//当前风速档
public void open() {
System.out.println("打开空调!");
}
public void close() {
System.out.println("关闭空调。");
}
public void updateWind(int channel) {
this.currentChannel = channel;
System.out.println("更换空调风速档位:" + channel);
}
}
public class Test {
public static void main(String[] args) {
// 命令接收者 (空调)
AirCondition myAir = new AirCondition();
// 开空调命令
OnOrder on = new OnOrder(myAir);
// 关空调命令
OnOrder off = new OnOrder(myAir);
// 换风速命令
ChangeSpeedOrder speed = new ChangeSpeedOrder(myAir, 2);
// 命令控制对象
Control control = new Control(on, off, speed);
// 开机
control.turnOn();
// 切换频道
control.changeChannel();
// 关机
control.turnOff();
}
}
測试结果:
打开空调!
更换空调风速档位:2
打开空调。
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 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
随机推荐
- struts2常见错误
1.Caught exception while loading file struts-default.xml - [unknown location]解决办法:由于lib包冲突造成的,将两个解析x ...
- AngularJS学习篇(十九)
AngularJS Bootstrap 可以在你的 AngularJS 应用中加入 Twitter Bootstrap,你可以在你的 <head>元素中添加如下代码: <link r ...
- ECMAScript arguments 对象(摘自W3C)
arguments 对象 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 message.用 argument ...
- phpstudy APACHE支持.htaccess以及 No input file specified解决方案
APACHE支持.htaccess以及 No input file specified解决方案 你的Apache安装文件夹conf里找到httpd.conf文件 索LoadModule rewrite ...
- C++雾中风景2:struct还是class?
之前因为都在忙着毕业的开题答辩与投稿论文的事宜,一直没有时间更新这个系列的文章.师弟看了上一篇雾中风景的文章,希望我继续把这个系列的文章写下去.坦白说,C++的特性很多,这也不是教学指南的文章,我会选 ...
- 在LINQ查询中LINQ之Group By的用法
LINQ定义了大约40个查询操作符,如select.from.in.where.group 以及order by,借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据.Linq有很 ...
- tornado超时机制
1.https://blog.lzhaohao.info/archive/build-a-comet-application-using-tornado-and-nginx/ 2.http://qin ...
- Django之用户登录实例
1,django目录结构(需要用到的文件用红箭头标记): 2,首先在templates模版目录下创建login.html文件 3,将bootstrap导入到static/plugins目录下 PS ...
- 泛型里的super和extend
<? extends T>和<? super T>应该怎么用? 网上看到一些比较难懂的回答,但是在EffectiveJava(2th Edition)遇到简单明了的解释: If ...
- 一个高性能异步socket封装库的实现思路 (c#)
前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...