Design Pattern学习笔记 --- Command(命令)模式
2012-06-28 17:24
405 查看
Command(命令)模式属于对象行为型模式;
Command命令模式通过将请求本身封装成一个对象,以期向未知的对象提出请求.并且这个对象可被存储并像其它的对象一样被传递.
实现Command模式的关键在于抽象出一个Command类;这个类定义了一个可执行操作的接口(抽象方法).具体的Command子类依赖一个接收都类的实例变量,在具体的Command子类实现抽象方法时调用接收者的动作以完成相应的操作.
㈠意图:
将一个请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排除或者记录请求日志;以及支持可撤销的操作;
-- GOF设计模式
功力暂时不够,不是很懂这句话的意思.
㈡理解:
必须向某对象提交请求;但是并不知道关于被请求的操作或请求的执行都的任何信息;
比如:我们在界面上提供一个按钮或者菜单;我们只是规定了要想使按钮(菜单)执行某些动作,必须调用它的Click方法;这时我们就可以考虑用Command模式;和接口回调有点相似;都是将具体的执行交由客户来完成;
㈢UML图:
![](data:image/png;base64,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)
㈣场景描述:
考虑一个计算器模型的设计:
计算器的大致框架我们作为厂商可以提供出来;一排排的按钮和点击这些按钮可以触发一些操作;(作为计算器模型的硬件提供商) Command(抽象类)
计算器的软件提供商则会对计算器的具体按钮进行封装; 具体Command类
每一个不同类型的Command类会执行相应的动作;进行加,减,乘,除的操作;(调用真正地处理方法)
而传入的数据则对应每个具体的接收者.(加1, 加2, 加3, 加4)
没有按"="号之前就相当于维护在一个Invoker,去不断地接收命令.
(五)代码实现:
本文出自 “hubert_guo” 博客,请务必保留此出处http://hubertguo.blog.51cto.com/2358769/911861
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
相关文章推荐
- java 设计模式学习笔记十二 command命令设计模式
- 设计模式C++学习笔记之十二(Command命令模式)
- java 设计模式学习笔记十二 command命令设计模式
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式学习笔记——命令(Command)模式
- 【设计模式】学习笔记8:命令模式(Command)
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式学习笔记(十七)——Command命令模式
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式C++学习笔记之十二(Command命令模式)
- 步步为营 .NET 设计模式学习笔记 九、Command(命令模式)
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式学习笔记(十七)——Command命令模式
- 【设计模式学习笔记十五】【行为模式】【命令模式(Command)】
- 设计模式C++学习笔记之十二(Command命令模式)
- C#面向对象设计模式纵横谈 学习笔记15 Command命令模式(行为型模式)
- 设计模式学习笔记(十六)——Command命令
- 设计模式学习笔记--Command命令模式
- 设计模式学习笔记--命令模式command pattern(Java版)
- 设计模式C++学习笔记之四(Command命令模式)