电脑装配好了,如何开机?谁来完成这些过程?如何完成?客户与主板如何产生联系?
从客户的角度来看,开机就是按下按钮,不管什么样的主板都是一样的,也就是说,客户只管命令,谁接受命令,谁实现命令,如何实现,客户是不关心的。
目录
使用命令模式演示简单的计算器功能,并允许执行undo与redo(java)
一、模式初识
1.什么是命令模式(Command)?
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分隔开,委派给不同的对象。
2.命令模式的基本结构
3.命令模式每个类的职责
①Command类:用来声明执行操作的窗口。
②ConcereCommand类:将一个接受者对对象绑定于动作,调用接受者相应的操作,以实现Execute。
③Invoker类:要求该命令执行这个请求。
④Receiver类:知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接受者。
二、模式深入
1.使用情景
①请求队列化
②支持取消操作
③把对系统的操作功能重新执行一边
④在需要事务的系统中
2.命令模式的优点
命令允许请求的一方和接受请求的一方能够独立演化
3.本质
封装请求
三、模式实例
使用命令模式演示简单的计算器功能,并允许执行undo与redo(java)
package a01a;
public interface Command {
abstract public void Execute();
abstract public void UnExecute();
}
package a01a;
public class CalculatorCommand implements Command {
private char operator;
private int operand;
private Calculator calculator;
public CalculatorCommand(char operator, int operand, Calculator calculator) {
super();
this.operator = operator;
this.operand = operand;
this.calculator = calculator;
}
public char getOperator() {
return operator;
}
public void setOperator(char operator) {
this.operator = operator;
}
public int getOperand() {
return operand;
}
public void setOperand(int operand) {
this.operand = operand;
}
@Override
public void Execute() {
// TODO Auto-generated method stub
calculator.Operation(operator,operand);
}
@Override
public void UnExecute() {
// TODO Auto-generated method stub
calculator.Operation(Undo(operator),operand);
}
private char Undo(char operator) {
char undo=' ';
switch(operator) {
case '+':undo='-';break;
case '-':undo='=';break;
case '*':undo='/';break;
case '/':undo='*';break;
}
return undo;
}
}
package a01a;
import java.util.ArrayList;
import java.util.List;
public class User {
private Calculator calculator=new Calculator();
private List<Command> commands=new ArrayList<Command>();
private int current=0;
public void Redo(int levels) {
System.out.println("----Redo"+levels+"levels");
for(int i=0;i<levels;i++) {
if(current<commands.size()-1) {
((Command) commands.get(current++)).Execute();
}
}
}
public void Undo(int levels) {
System.out.println("----Undo"+levels+"levels");
for(int i=0;i<levels;i++) {
if(current>0) {
((Command) commands.get(--current)).Execute();
}
}
}
public void Compute(char operator,int operand) {
Command command=new CalculatorCommand(operator,operand,calculator);
command.Execute();
commands.add(command);
current++;
}
}
package a01a;
public class Calculator {
private int total=0;
public void Operation(char operator,int operand) {
switch(operator) {
case '+':total+=operand;break;
case '-':total-=operand;break;
case '*':total*=operand;break;
case '/':total/=operand;break;
}
System.out.println("Total="+total+"(following"+operator+","+operand+")");
}
}
package a01a;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
User user=new User();
user.Compute('+',100);
user.Compute('-',50);
user.Compute('*',10);
user.Compute('/',2);
user.Undo(4);
user.Redo(3);
}
}