GOF的定义:
命令模式(别名:动作,事物)
将一个请求封装成一个对象,从而使用户可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作.
在许多设计中, 经常涉及到一个对象请求另一个对象调用其方法达到某种目的. 如果请求者不希望或无法直接和被请求者打交到, 即不希望或无法含有被请求者的引用,那么就可以使用命令模式.
提出请求的对象为请求者, 被请求的对象为接收者. 在命令模式中, 当一个对象请求另一个对象调用其方法时, 不和被请求的对象直接打交道, 而是把这种"请求"封装到一个称作"命令"的对象中, 其封装手段是将"请求"封装在"命令"对象的一个方法中.
命令模式的核心就是使用命令对象来封装方法调用, 即将请求者的请求, 接收者调用方法封装到命令对象的一个方法中, 这样, 当一个对象请求另一个对象调用方法来完成某项任务时,只需和命令对象打交道, 即让命令对象调用封装了"请求"的那个方法即可.
命令模式的优点:
1. 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合.
2. 命令模式满足"开-闭"原则. 如果增加新的具体命令和该命令的接收者, 不必修改调用者的代码, 调用者就可以使用新的命令对象; 反之, 如果增加新的调用者, 不必修改现有的具体命令和接收者, 新增加的调用者就可以使用自己已有的具体命令
3.由于请求者被封装到了具体命令中, 那么就可以将具体命令保存到持久化的媒介中, 在需要的时候, 重新执行这个具体命令. 因此使用命令模式可以记录日志.
4.使用命令模式可以对请求者的"请求"进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令.
package CommandPattern;
import javax.swing.*;
public class Camera extends JPanel{
String name;
Icon imageIcon;
JLabel label;
public Camera(){
label=new JLabel("我是摄像头");
add(label);
}
public void on(){
label.setIcon(new ImageIcon("cameraOpen.jpg"));
}
public void off(){
label.setIcon(new ImageIcon("cameraOff.jpg"));
}
}
package CommandPattern;
import javax.swing.*;
public class Light extends JPanel{
String name;
Icon imageIcon;
JLabel label;
public Light(){
label=new JLabel("我是照明灯");
add(label);
}
public void on(){
label.setIcon(new ImageIcon("lightOpen.jpg"));
}
public void off(){
label.setIcon(new ImageIcon("lightOff.jpg"));
}
}
package CommandPattern;
public class OnCameraCommand implements Command{
Camera camera;
OnCameraCommand(Camera camera){
this.camera=camera;
}
public void execute(){
camera.on();
}
public String getName(){
return "打开摄像头!";
}
}
package CommandPattern;
public class OffCameraCommand implements Command{
Camera camera;
OffCameraCommand(Camera camera){
this.camera=camera;
}
public void execute(){
camera.off();
}
public String getName(){
return "关闭摄像头!";
}
}
package CommandPattern;
public class OnLightCommand implements Command{
Light light;
OnLightCommand(Light light){
this.light=light;
}
public void execute(){
light.on();
}
public String getName(){
return "打开 照明灯!";
}
}
package CommandPattern;
public class OffLightCommand implements Command{
Light light;
OffLightCommand(Light light){
this.light=light;
}
public void execute(){
light.off();
}
public String getName(){
return "关闭 照明灯!";
}
}
package CommandPattern;
public interface Command {
public abstract void execute();
public abstract String getName();
}
package CommandPattern;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Invoke {
JButton button;
Command command;
Invoke(){
button=new JButton();
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
executeCommand();
}
});
}
public void setCommand(Command command){
this.command=command;
button.setText(command.getName());
}
public JButton getButton(){
return button;
}
private void executeCommand(){
command.execute();
}
}
package CommandPattern;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Machine extends JFrame{
Invoke requestOnCamera,requestOffCamera,requestOnLight,requestOffLight;
Camera camera; Light light;
Machine(){
setTitle("小电器");
requestOnCamera=new Invoke();
requestOffCamera=new Invoke();
camera=new Camera();
light=new Light();
requestOnCamera.setCommand(new OnCameraCommand(camera));
requestOffCamera.setCommand(new OffCameraCommand(camera));
requestOnLight=new Invoke();
requestOffLight=new Invoke();
requestOnLight.setCommand(new OnLightCommand(light));
requestOffLight.setCommand(new OffLightCommand(light));
initPosition();
setSize(200,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void initPosition(){
JPanel pSourth=new JPanel();
pSourth.add(requestOnCamera.getButton());
pSourth.add(requestOffCamera.getButton());
pSourth.add(requestOnLight.getButton());
pSourth.add(requestOffLight.getButton());
add(pSourth,BorderLayout.SOUTH);
JPanel pNorth=new JPanel();
pNorth.add(light);
add(pNorth,BorderLayout.NORTH);
JPanel pCenter=new JPanel();
pCenter.setBackground(Color.yellow);
pCenter.add(camera);
add(pCenter,BorderLayout.CENTER);
}
public static void main(String agrs[]){
Machine macine=new Machine();
}
}
- 大小: 41.8 KB
分享到:
相关推荐
该PPT用于公司内部分享设计模式6---命令模式之用,言简意赅,形象生动.故此分享,希望大家一起学习
设计模式学习笔记-命令模式
1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...
设计模式C++学习之命令模式(Command)
值得学习的命令模式代码,会让你有一定的收获,并有详细的说明和代码解析。
“[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...
培养学生掌握简单工厂模式、工厂方法模式、单例模式、原型模式、桥接模式、适配器模式、装饰模式、代理模式、命令模式、观察者模式等常用设计模式的设计思想,并掌握在实际软件工程领域中的运用,能够把所学的原理...
【例4.7】命令模式-室内温度控制-2个GUI 【例4.8】命令模式-室内温度控制-3个GUI 【例4.10】中介者模式-旅游信息共享 【例4.11】中介者模式-海岛机场 【例4.13】策略模式-整数排序 【例4.14】策略...
代理模式学习笔记、单例模式学习笔记、命令模式、原型模式、模式特点总结。 为个人对设计模式的理解,如果有理解不一致的不要砸砖啊
也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...
代理设计模式、命令模式学习笔记,其中包含对模式的理解以及详细的模式使用示例
也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...
也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...
2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,...
Java版本的设计模式实例,其中包括“桥接模式、命令模式”两个实例,这都是我自己学习后自己写的。。。希望大家指导。。。
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...
里面包含常规算法学习demo; 设计模式的分类 ...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。