重学java23种设计模式(14)命令模式
2015-08-09 10:45
656 查看
跟着《软件秘笈---设计模式那点事》学习
定义:
命令模式(Command Pattern),将来自客户端的请求封装为一个对象,无须了解这个请求激活的动作或有关接受的处理细节。命令模式的根本目的在于将请求者与实现者之间解耦。其实命令者模式与很多其他模式一样,就是在请求者和实现者之间增加一个中间人的角色,来达到解耦的目的。通过对中间角色的特殊设置从而形成不同的设计模式,命令模式也不例外。命令模式正式通过一个中间的命令者完成请求与实现之间的解耦。
角色:
(1)抽象命令角色(Command):生命命令执行操作的接口,由java接口或者抽象类来实现。
(2)具体命令角色(Concrete Command):在具体的命令角色中绑定命令接收者,命令调用接受者做出相应的操作,从而实现命令角色生命的执行操作的接口行为。
(3)请求者角色(Invoker):命令的启动者角色,调用命令对象执行请求。
(4)接收者角色(Recevier):具体命令执行时的行为对象,任何类都可能作为一个接收者。
(5)客户角色(Client):创建一个具体命令对象,并分命令的接受者。
类图:
实例:
我觉得《软件秘籍》中这个例子并不好,因为邮局发送邮件,邮件送到接收者手中,邮局封装成一个命令太牵强。而且感觉约定俗成,接口应该名叫execute。所以直接上《Head First》中的例子。
public class Light {
public void off() {
System.out.println("Light is off!");
}
public void on() {
System.out.println("Light is on!");
}
}
分析:
命令模式就是把命令提取成一个接口,命令模式就是把命令提取成一个接口,命令模式就是把命令提取成一个接口,重要的事情说三遍。
命令接口有一个execute方法,命令接口有一个execute方法,命令接口有一个execute方法,重要的事情说三遍。
使用场合:
(1)抽象出待执行的动作以参数化某对象。类似于过程设计中的回调机制,而命令模式正式回调机制的一个面向对象的替代品。
(2)在不同的时刻制定、排列和执行请求。
(3)需要支持可撤销的操作。
(4)需要支持修改日志功能。这样当系统崩溃时,这些修改可以被重做一遍。
(5)需要支持事务系统。
一句话总结:
命令封装成了一个接口,命令持有接受者引用,发送者持有命令接口。
参考资料:
《软件秘笈---设计模式那点事》
定义:
命令模式(Command Pattern),将来自客户端的请求封装为一个对象,无须了解这个请求激活的动作或有关接受的处理细节。命令模式的根本目的在于将请求者与实现者之间解耦。其实命令者模式与很多其他模式一样,就是在请求者和实现者之间增加一个中间人的角色,来达到解耦的目的。通过对中间角色的特殊设置从而形成不同的设计模式,命令模式也不例外。命令模式正式通过一个中间的命令者完成请求与实现之间的解耦。
角色:
(1)抽象命令角色(Command):生命命令执行操作的接口,由java接口或者抽象类来实现。
(2)具体命令角色(Concrete Command):在具体的命令角色中绑定命令接收者,命令调用接受者做出相应的操作,从而实现命令角色生命的执行操作的接口行为。
(3)请求者角色(Invoker):命令的启动者角色,调用命令对象执行请求。
(4)接收者角色(Recevier):具体命令执行时的行为对象,任何类都可能作为一个接收者。
(5)客户角色(Client):创建一个具体命令对象,并分命令的接受者。
类图:
实例:
我觉得《软件秘籍》中这个例子并不好,因为邮局发送邮件,邮件送到接收者手中,邮局封装成一个命令太牵强。而且感觉约定俗成,接口应该名叫execute。所以直接上《Head First》中的例子。
public class Light {
public void off() {
System.out.println("Light is off!");
}
public void on() {
System.out.println("Light is on!");
}
}
/** *命令接口 **/ public interface Command{ public void execute(); }
/** *控制灯的命令(开灯) **/ public class LightOnCommand implements Command{ //命令中持有一个灯对象 Light light; public LightOnCommand(Light light){ this.light=light; } //实现接口中的execute()方法 public void execute(){ //开灯 light.on(); } }
public class SimpleRemoteControl{ //包含命令 Command command; public SimpleRemoteControl(){} //设置接收命令 public void setCommand(Command command){ this.command=command; } //按钮方法,按下按钮时执行动作 public void buttonWasPressed(){ //调用命令的执行方法 this.command.execute(); } }
public class RemoteControlTest{ public static void main(String[] agrs){ //实例化灯(接收者) Light light = new Light(); //实例化开灯命令类(包含一个灯的对象) LightOnCommand lightOnCommand = new LightOnCommand (light); //实例化控制装置(遥控器) SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl(); //将开灯命令装入控制装置 simpleRemoteControl.setCommand(lightOnCommand ); //执行方法(开灯) simpleRemoteControl.buttonWasPressed(); } }
分析:
命令模式就是把命令提取成一个接口,命令模式就是把命令提取成一个接口,命令模式就是把命令提取成一个接口,重要的事情说三遍。
命令接口有一个execute方法,命令接口有一个execute方法,命令接口有一个execute方法,重要的事情说三遍。
使用场合:
(1)抽象出待执行的动作以参数化某对象。类似于过程设计中的回调机制,而命令模式正式回调机制的一个面向对象的替代品。
(2)在不同的时刻制定、排列和执行请求。
(3)需要支持可撤销的操作。
(4)需要支持修改日志功能。这样当系统崩溃时,这些修改可以被重做一遍。
(5)需要支持事务系统。
一句话总结:
命令封装成了一个接口,命令持有接受者引用,发送者持有命令接口。
参考资料:
《软件秘笈---设计模式那点事》
相关文章推荐
- java静态代码块真的会优先执行吗
- Java读取文件MD5的两种方案
- java中图的两种存储方式
- Java学习之路:不走弯路,就是捷径
- 编码剖析Spring装配基本属性的原理
- JAVA环境变量配置
- Java字符串和输入流的相互转换
- Java中方法名和类名的规范
- java 单例模式
- Spring整合Hibernate遇到的错误
- JAVA环境变量配置
- Java中wait,notify方法
- java i/o操作
- MyEclipse 10 部署项目时报错,抛出java.lang.NullPointerException异常的解决方法
- Spring核心之Ioc容器走读笔记
- 【Java多线程】之三:Java Thread Join Example
- 安装JDK:找不到或无法加载主类 com.sun.tools.javac.Main
- elipse安装Genymotion插件时候输入网址没有显示可以下载的
- 【Java】字符串模板替换
- Java内部类