您的位置:首页 > 其它

Design Pattern学习笔记 --- Command(命令)模式

2012-06-28 17:24 405 查看
Command(命令)模式属于对象行为型模式;

Command命令模式通过将请求本身封装成一个对象,以期向未知的对象提出请求.并且这个对象可被存储并像其它的对象一样被传递.

实现Command模式的关键在于抽象出一个Command类;这个类定义了一个可执行操作的接口(抽象方法).具体的Command子类依赖一个接收都类的实例变量,在具体的Command子类实现抽象方法时调用接收者的动作以完成相应的操作.

㈠意图:

将一个请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排除或者记录请求日志;以及支持可撤销的操作;

-- GOF设计模式

   功力暂时不够,不是很懂这句话的意思.

㈡理解:

必须向某对象提交请求;但是并不知道关于被请求的操作或请求的执行都的任何信息;

比如:我们在界面上提供一个按钮或者菜单;我们只是规定了要想使按钮(菜单)执行某些动作,必须调用它的Click方法;这时我们就可以考虑用Command模式;和接口回调有点相似;都是将具体的执行交由客户来完成;

㈢UML图:



㈣场景描述:

考虑一个计算器模型的设计:

计算器的大致框架我们作为厂商可以提供出来;一排排的按钮和点击这些按钮可以触发一些操作;(作为计算器模型的硬件提供商) Command(抽象类)

计算器的软件提供商则会对计算器的具体按钮进行封装; 具体Command类

每一个不同类型的Command类会执行相应的动作;进行加,减,乘,除的操作;(调用真正地处理方法)

而传入的数据则对应每个具体的接收者.(加1, 加2, 加3, 加4)

没有按"="号之前就相当于维护在一个Invoker,去不断地接收命令.

(五)代码实现:

/**
* Command模式中的command抽象类
*/
package com.skywares.designpattern.command;

/**
* @author hubert
*
*/
public abstract class Command {
protected abstract void command();
}

/**
*
*/
package com.skywares.designpattern.command;

/**
* @author hubert
*
*/
public class AddCommand extends Command {

private AddReceiver addReceiver;
public AddCommand(AddReceiver addReceiver)
{
this.addReceiver = addReceiver;
}

@Override
protected void command() {
addReceiver.add();
}

}

/**
* Command模式中的Receiver操作;知道如何实施和执行一个相关的操作;任何类都可能作为一个接收者
*/
package com.skywares.designpattern.command;

/**
* @author hubert
*
*/
public class AddReceiver {

public void add()
{
System.out.println(" 加上一 ");
}

}


/**
*
*/
package com.skywares.designpattern.command;

/**
*
* @author hubert
*
*/
public class SubtractionCommand extends Command{

private SubtractionReceiver subtractionReceiver;

public SubtractionCommand(SubtractionReceiver subtractionReceiver)
{
this.subtractionReceiver = subtractionReceiver;
}

@Override
protected void command() {
// TODO Auto-generated method stub
subtractionReceiver.subtract();
}

}


/**
*
*/
package com.skywares.designpattern.command;

import java.util.ArrayList;
import java.util.List;

/**
* @author hubert
*
*/
public class Invoker {

private List<Command> commandSeq = new ArrayList<Command>();

public List<Command> getCommandSeq() {
return commandSeq;
}

public void setCommandSeq(List<Command> commandSeq) {
this.commandSeq = commandSeq;
}

public List<Command> addCommand(Command command)
{
commandSeq.add(command);
return commandSeq;
}

public List<Command> removeCommand(Command command)
{
if(this.commandSeq != null && this.commandSeq.contains(command))
{
commandSeq.remove(command);
}

return commandSeq;
}

}

/**
*
*/
package com.skywares.designpattern.command;

/**
* @author hubert
*
*/
public class SubtractionReceiver {
public void subtract()
{
System.out.println(" 减少一 ");
}
}


/**
*
*/
package com.skywares.designpattern.command;

/**
* @author hubert
*
*/
public class Client {

/**
* @param args
*/
public static void main(String[] args) {

AddReceiver addReceiver = new AddReceiver();
Command addCommand = new AddCommand(addReceiver);

SubtractionReceiver subtractionReceiver = new SubtractionReceiver();
Command subCommand = new SubtractionCommand(subtractionReceiver);

Invoker invoker = new Invoker();
invoker.addCommand(addCommand).add(subCommand);

for(Command command : invoker.getCommandSeq())
{
command.command();
}

}

}


本文出自 “hubert_guo” 博客,请务必保留此出处http://hubertguo.blog.51cto.com/2358769/911861
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: