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
分享到:
相关推荐
C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...
该PPT用于公司内部分享设计模式6---命令模式之用,言简意赅,形象生动.故此分享,希望大家一起学习
总的来说,这个压缩包中的内容很可能是包含了一个命令模式和享元模式的示例程序,通过分析和学习这个实例,我们可以更好地理解和掌握这两种设计模式的运用场景、实现方式以及它们在实际项目中的价值。对于想要深入...
通过学习和掌握GoF的23种设计模式,可以显著提高程序员的编码水平,使得开发出的软件系统更加健壮、可扩展、易维护。以上每种模式都有其特定的应用场景,理解和掌握它们的关键在于不断实践和总结,在实际项目中灵活...
总结来说,设计模式是软件开发中的重要工具,通过学习和运用不同的设计模式和设计原则,可以帮助开发者更好地解决编程中的各种问题,提升代码质量和团队协作效率。在Java开发中,正确理解和应用这些模式和原则,对于...
通过这个"通俗易懂版"的学习资源,你将能够深入理解每种设计模式的原理,掌握如何在实际项目中应用它们,提升代码的可维护性和复用性。阅读《设计模式_20090916.pdf》文档,结合具体的代码示例,相信你将能够更好地...
总之,《新版设计模式手册 - C#设计模式(第二版)》是学习和掌握C#设计模式的宝贵资源,通过学习和实践书中的内容,开发者能够提升软件设计能力,编写出更优雅、可维护的代码。这本书将帮助你从一个代码实现者成长为...
2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...
命令模式是一种行为设计模式,它的主要目的是将请求封装为对象,以便于参数化不同请求、队列请求、记录请求日志以及支持撤销和重做操作。在软件开发中,它帮助解耦了请求发起者(调用者)和请求执行者(接收者),...
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这个压缩包文件名为"26种...通过深入学习和实践这些设计模式,开发者可以进一步提升自己的编程技能,更好地应对各种复杂的软件设计挑战。
通过学习和应用这些设计模式,开发者可以更好地组织代码,提高代码的可扩展性和可维护性。QT4的API设计也鼓励了这些模式的使用,使得开发者能够构建出高效、可复用的跨平台应用程序。对于初学者,理解这些模式并将其...
这份PPT涵盖了设计模式的全貌,对于初学者来说,是一个很好的学习资源。通过深入学习这些模式,开发者可以更好地理解和应用面向对象设计原则,提升代码质量和可维护性。同时,理解并熟练运用设计模式,也是成为一名...
通过阅读《设计模式-Java语言中的应用》,读者不仅可以掌握设计模式的基本概念和原理,还能学习到如何在实际项目中选择合适的设计模式,以及如何优雅地在Java代码中实现这些模式。这将有助于提升开发者的编程技巧,...
通过学习设计模式,我们可以更好地组织代码结构,提高软件质量,同时减少开发过程中的重复工作。本文将详细介绍GoF提出的23种设计模式,并提供C++实现示例,帮助读者深入理解这些模式的应用场景和技术细节。 #### ...
设计模式是软件工程中的一种最佳实践,用于解决常见的编程问题,提供可复用的解决方案。...在VS2012环境下,你可以通过这些代码学习如何在C#中组织和编写符合设计模式原则的代码,从而提高代码质量和可维护性。
《设计模式--基于C#的工程化实现及扩展》是一本深入探讨软件设计模式的书籍,作者为王翔。本书的核心目标是通过C#语言,系统地介绍和讲解设计模式在实际工程中的应用与拓展。设计模式是软件开发中经过实践验证的、可...