`
xyheqhd888
  • 浏览: 409276 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

Command(命令)模式

阅读更多

  让方法运行的最常见方式调用之。但是在很多情况下,我们不能控制和提供方法执行的时机或者上下文。 在这些情况下,可以把方法封装在对象中。通过在对象中存储调用方法所需的信息,就可以让客户端或者服务决定何时调用这个方法。

  Commmand模式的意图是把请求封装在对象中

 

1.经典范例:菜单命令

  支持菜单的工具集通常都会用到Command模式。每个菜单项都需要配置一个对象,当用户单击它时,可以执行所绑定的对象。这种设计思想使GUI程序逻辑和应用逻辑可以分离开。Swing库就采用这种方法,允许把ActionListener与每个JmenuItem关联起来。

  我们该如何安排才能让一个类在用户单击菜单时调用对应的方法呢?解决的方法就是应用多态性,具体做法如下:首先将操作的名称固定,然后针对不同的类给出不同的实现。对于JMenuItem类而言,该操作就是actionPerformed()。当用户选择某个菜单项的时候,JMenuItem对象就调用其监听器对象的actionPerformed()方法。

 

突破题:java的菜单机制使得Command模式可以很容易地应用于菜单的制作,但是我们并不一定要应用Command模式来组织代码。事实上,在应用程序的开发过程中,通常会用单个对象来监听GUI中的所有事件,请问这种做法遵循了哪一种设计模式?

答:Java Swing应用程序通常应用中介者模式,注册单个对象来接收所有的GUI事件。该对象可以仲裁图形组件的交互,并将用户的输入转换为控制业务域对象的命令。

 当我们在开发Swing应用程序的时候,我们可能会注册单个对象来监听应用程序中的所有GUI事件,特别是在GUI组件交互的时候。不过,对于菜单而言,这并不是最佳的设计模式。如果我们用单个对象作为所有GUI事件的监听器,那么当有事件发生的时候,该对象必须查询出产生事件的GUI对象。而如果在应用程序中有许多菜单项,且它们都对应不同的操作,那么我们最好是应用command模式。  

 当用户选择某菜单项的时候,调用的方法是actionPerformed()。当你创建该菜单项时,可以使用对应于特定命令行为的actionPerformed()方法,给它绑定一个监听器对象(ActionListener)。我们可以定义一个新类来实现这个小功能;不过,更好的做法是,直接使用一个匿名类来实现。

 com.oozinoz.visualization包中的Visualization2类提供了一个“文件”菜单条,包括“Save as ...”,“Restore from ...“两个菜单项。它们分别注册了一个监听器,用于监听用户的单击事件。这两个监听器分别实现了actionPerformed()方法,并分别调用了Visualization2类的save()方法和load()方法。

package com.oozinoz.visualization;
import java.awt.event.*:
import javax.swing.*;
import com.oozinoz.ui.*;
public class Visualization2 extends Visualization
{
	public static void main(String[] args)
	{
		Visualization2 panel = new Visualization2(UI.NORMAL);
		JFrame frame = SwingFacade.launch(panel,"Operational Model");
		frame.setJMenuBar(panel.menus());
		frame.setVisible(true);
	}

	public Visualization2(UI ui){
		super(ui);
	}

	public JMenuBar menus(){
		JManuBar menuBar = new JMenuBar();

		JMenu menu = new JMenu("File");
		menuBar.add(menu);

		JMenuItem menuItem = new JMenuItem("Save As...");
		menuItem.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				save();
			}
		});

		JMenuItem menuItem = new JMenuItem("Restore From...");
		menutItem.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				restore();
			}
		});

		menu.add(menuItem);
		return menuBar;
	}

	public void save(){
		try {
            mediator.save(this);
        } catch (Exception ex) {
            System.out.println("Failed save: " + ex.getMessage());
        }
	}

	public void restore(){
		try {
            mediator.restore(this);
        } catch (Exception ex) {
            System.out.println("Failed restore: " + ex.getMessage());
        }
	}
}

 

 当为一个菜单添加各种命令之后,你还必须将命令应用于其他开发者提供的上下文:Java菜单框架。在Command模式的某些应用场合,你还必须承担上下文开发者的角色,创建命令执行的上下文。例如,我们可能会提供计时服务来记录方法的执行时间。

 

分享到:
评论

相关推荐

    (行为型模式) Command 命令模式

    ### (行为型模式) Command 命令模式 #### 概述 在软件工程领域,设计模式被广泛地应用于解决常见的编程难题。其中,“Command”(命令)模式是一种行为型设计模式,它允许将请求封装成对象,从而使你能够用不同的...

    Command命令模式介绍.docx

    ### Command命令模式详解 #### 概述 Command命令模式是一种常用的设计模式,属于对象行为型模式之一。它的核心思想在于将请求封装成一个对象,从而让发出请求的对象和执行请求的对象解耦。这种方式有助于实现软件...

    Command命令模式介绍[参照].pdf

    Command命令模式是一种面向对象的设计模式,属于行为设计模式,它主要解决了在软件开发中行为请求者与行为实现者之间的紧密耦合问题。这种耦合可能导致系统难以维护和扩展。通过Command模式,我们可以将请求封装为一...

    Command 命令模式

    **命令模式** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列请求、或者记录请求日志。在软件工程中,命令模式的应用广泛,尤其是在处理事件驱动系统或者需要解耦调用者与被...

    C#面向对象设计模式纵横谈\15 行为型模式Command命令模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第15节:行为型模式Command命令模式

    C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式 (Level 300)

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C#编程中,这种模式常用于解耦调用者和接收者,提高代码的灵活...

    命令模式(Command模式)

    **命令模式(Command模式)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列或者记录请求日志,还可以支持可撤销的操作。在命令模式中,我们创建表示各种操作的类...

    设计模式之Command(命令)模式

    此外,"Command模式.ppt"和"Command模式.docx"可能包含了对命令模式更深入的理论解释和示例代码,帮助学习者理解其原理和应用。 总之,Command模式通过将操作封装在独立的类中,提高了代码的可读性和可维护性,同时...

    设计模式之命令模式(Command Pattern)

    命令模式是一种行为设计模式,它将请求封装成独立的对象,使得可以使用不同的请求、队列请求、记录请求历史以及支持可撤销的操作。这种模式在软件工程中被广泛应用,尤其是在需要解耦请求发起者和接收者时,提高了...

    详解设计模式中的Command命令模式及相关C++实现

    C++实现命令模式时,通常会定义一个Command基类,包含Execute()接口,然后创建多个ConcreteCommand子类,每个子类对应一个具体操作。接收者Receiver类包含实际的操作实现。Invoker类持有一个Command对象的引用,并在...

    设计模式之命令模式(Command)

    命令模式的核心概念包括四个角色:客户端(Client)、命令接口(Command Interface)、具体命令(Concrete Command)和接收者(Receiver)。让我们逐一深入理解这些角色: 1. 客户端(Client):客户端是整个系统中...

    设计模式C++学习之命令模式(Command)

    命令模式是一种行为设计模式,它将请求封装为一个对象,使得可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中,命令模式的应用可以帮助我们更好地组织代码,提高代码的可扩展性和可维护性。...

    命令模式command pattern

    命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列请求,或者支持可撤销的操作。在Java中实现命令模式,我们可以利用面向对象编程的特性来构建系统,使得...

    命令模式_Command

    命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在IT行业中,命令模式广泛应用于软件架构和系统设计,以提高代码...

    C++设计模式代码资源23_Command_命令模式.zip

    在`Command.cpp`这个文件中,我们可以预期会看到关于命令模式的实现。通常,命令模式包含以下关键角色: 1. **Command(命令)接口**:定义一个执行操作的接口。所有具体命令类都实现了这个接口。 2. **Concrete ...

    命令(command)模式

    在给定的压缩包文件"command_02"中,可能包含了一些关于命令模式的实例代码或者进一步的解释。通常,这样的文件会展示如何创建命令接口、具体命令类、请求者和接收者类,并演示如何在程序中使用这些类来实现命令模式...

    command 模式的c++实现

    **命令模式(Command Pattern)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中实现命令模式,可以有效地解耦调用者和...

    WPF Binding绑定 Command命令基础学习源码

    命令模式是设计模式之一,WPF中的命令主要用于处理UI交互,分离用户界面与业务逻辑。命令分为两种类型:依赖属性命令(DependencyProperty-based Commands,如ButtonBase.Command)和实现ICommand接口的自定义命令。...

Global site tag (gtag.js) - Google Analytics