*通常情况下:行为请求者与实现者通常呈现一种高度耦合状态。有时要对行为进行变更处理处理。高度耦合方式就显得不合适。

* 将行为请求者与行为实现者解耦,将一组行为抽象为对象。实现二者之间的松耦合。

这就是命令模式(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设计模式之:命令模式的更多相关文章

  1. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  2. Java设计模式 之 命令模式

    1      从属模式分类 行为性模式 2      命令模式意图 命令模式可将动作的请求者和动作的执行者对象中解耦. 该模式将一个行为操作发起者的请求封装到对象中,该请求由另外一个对象执行. 将动作 ...

  3. JAVA设计模式之 命令模式【Command Pattern】

    一.概述 命令模式能够将请求发送者和接收者全然解耦.发送者与接收者之间没有直接引用关系,发送请求的对象仅仅须要知道怎样发送请求,而不必知道怎样完毕请求.核心在于引入了命令类,通过命令类来减少发送者和接 ...

  4. 14.java设计模式之命令模式

    基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...

  5. java设计模式之命令模式

    学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习 ...

  6. java设计模式之命令模式以及在java中作用

    命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请 ...

  7. 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式

    目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ...

  8. 用Java 8 Lambda表达式实现设计模式:命令模式

    在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...

  9. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  10. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

随机推荐

  1. 利用HTML5新特性改变浏览器地址后不刷新页面

    原文:http://www.cnblogs.com/xuchengzone/archive/2013/04/18/html5-history-pushstate.html   作为一个程序员,上Git ...

  2. css 选择器和优先级

    css样式是做网页时,页面 布局不可或缺的关键点.但是在做网页时,会遇到一些明明已经设置了样式的元素,缺无法达到想要的效果,这种情况比较常见.这就涉及到优先级的问题了 要说到css的优先级,先来看下c ...

  3. 【Tesseract】Tesseract 的训练流程

    在泰迪杯A题中,我刚刚接触了Tesseact,其中训练字库中遇到了较多的问题.所以在此记录一下,也当做一个笔记,省得以后忘记. 为了方便 ,将tif命名格式设为[lang].[fontname].ex ...

  4. C#链接数据库增删改查的例子

    以users表为例,有三个字段,自增长的编号id,int类型:名称name,nvarchar类型,密码pwd,nvarchar类型首先在vs2005中引入using System.Data.SqlCl ...

  5. C#用panel实现子窗体的切换

    今天编程的时候,遇到一个问题:在同一个窗体区域加载两个不同的窗体,每次只显示一个子窗体并能够对这两个子窗体做切换. 对于这个问题用panel控件是非常简单的,只要每次清空panel控件上的子窗体,然后 ...

  6. JDBC数据库编程

    常识名词:ODBC ,JDBC,JDBC API ,JDBC Driver API  数据准备,续上节:   JDBC编程流程 最基本的JDBC操作 本段内容主要完成JDBC的增删查改操作 packa ...

  7. [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    转载自http://janeky.iteye.com/blog/769965     Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...

  8. 重构手法之Split Temporary Variable(分解临时变量)

    返回总目录 本小节目录 Split Temporary Variable(分解临时变量) Remove Assignments to Parameters(移除对参数的赋值) 6.6Split Tem ...

  9. Powershell 远程连接ARM Windows Server VM 并关闭 Firewall

    准备环境:Azure ARM Windows Server 2008 R2 机器 1.登陆机器查看防火墙,是开着的 2.查看机器的监听端口,发现没有Powershell远程管理对应的端口5985或59 ...

  10. 基于微博LBS API开发的周边美图android app

    [app 不完善,就差api了] 几年之前看到过新浪微博开放API中有基于Place的API,授权后可以查看基于地理位置的一些数据,比如某个地点周边的微博动态.某个具体用户的位置动态等等.最近空余时间 ...