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 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
随机推荐
- SQL Server本地连接不上
1.打开SQL Server 2014配置管理器 2.启动服务
- DOM 遍历-同胞
在 DOM 树中水平遍历 有许多有用的方法让我们在 DOM 树进行水平遍历: siblings() next() nextAll() nextUntil() prev() prevAll() prev ...
- AngularJS学习篇(四)
AngularJS ng-model 指令 ng-model 指令用于绑定应用程序数据到 HTML 控制器(input, select, textarea)的值. <!DOCTYPE html& ...
- js 作用域,作用域链,闭包
什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...
- Web桌面应用框架3:Web桌面应用开发的N种Style
研究Web桌面应用开发有一段时间了,总结了Web桌面应用开发的一些主流方式. 一.前端Style 这种方式的就是直接实现一个Web程序,再封装一个浏览器展示,相当粗暴和有效.著名的框架就是Electr ...
- C#设计模式之十四模板方法模式(Template Method)【行为型】
一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...
- vue打包之后生成一个配置文件修改接口
前言: 我们的vue代码打包上传到服务器之后, 要是数据接口 以后换了域名什么的,是不是需要重新去vue文件里修改接口. 能不能生成一个配置文件,里面可以配置域名或其它什么字段之类的,这样以后换了域名 ...
- MySQL5.6的optimizer_trace
MySQL的explain是各种执行计划选择的结果,如果想看整个执行计划以及对于多种索引方案之间是如何选择的? MySQL5.6中支持这个功能,optimizer_trace 这个是mysql的参数, ...
- 一步一步带你实现virtual dom(二) -- Props和事件
很高兴我们可以继续分享编写虚拟DOM的知识.这次我们要讲解的是产品级的内容,其中包括:设置和DOM一致性.以及事件的处理. 使用Babel 在继续之前,我们需要弥补前一篇文章中没有详细讲解的内容.假设 ...
- 【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】
之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...