1.定义
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
2.实现(俄罗斯方块)
/**
* 俄罗斯方块操作的真正逻辑代码(左移,右移,快速落下,改变形状)
*/
public class RealOperation {
public void toLeft(){
System.out.println(
"toLeft");
}
public void toRight(){
System.out.println(
"toRight");
}
public void fastToBottom(){
System.out.println(
"fastToBottom");
}
public void transForm(){
System.out.println(
"transForm");
}
}
/**
* 命令的抽象,便于实现四个具体的命令
*/
public interface Command {
public void execute();
}
/**
* 左移的具体实现
*/
public class LeftCommand implements Command {
private RealOperation operation;
public LeftCommand(RealOperation operation) {
this.operation = operation;
}
@Override
public void execute() {
operation.toLeft();
}
}
/**
* 右移的具体实现
*/
public class RightCommand implements Command {
private RealOperation operation;
public RightCommand(RealOperation operation) {
this.operation = operation;
}
@Override
public void execute() {
operation.toRight();
}
}
/**
* 快速落下的具体实现
*/
public class FallCommand implements Command {
private RealOperation operation;
public FallCommand(RealOperation operation) {
this.operation = operation;
}
@Override
public void execute() {
operation.fastToBottom();
}
}
/**
* 改变形状的具体实现
*/
public class TransFormCommand implements Command {
private RealOperation operation;
public TransFormCommand(RealOperation operation) {
this.operation = operation;
}
@Override
public void execute() {
operation.transForm();
}
}
/**
* 四个命令的管理者
*/
public class Commander {
private LeftCommand leftCommand;
private RightCommand rightCommand;
private FallCommand fallCommand;
private TransFormCommand transFormCommand;
public LeftCommand
getLeftCommand() {
return leftCommand;
}
public void setLeftCommand(LeftCommand leftCommand) {
this.leftCommand = leftCommand;
}
public RightCommand
getRightCommand() {
return rightCommand;
}
public void setRightCommand(RightCommand rightCommand) {
this.rightCommand = rightCommand;
}
public FallCommand
getFallCommand() {
return fallCommand;
}
public void setFallCommand(FallCommand fallCommand) {
this.fallCommand = fallCommand;
}
public TransFormCommand
getTransFormCommand() {
return transFormCommand;
}
public void setTransFormCommand(TransFormCommand transFormCommand) {
this.transFormCommand = transFormCommand;
}
public void toLeft(){
leftCommand.execute();
}
public void toRight(){
rightCommand.execute();
}
public void fall(){
fallCommand.execute();
}
public void transForm(){
transFormCommand.execute();
}
}
public static void main(String[] args) {
RealOperation realOperation =
new RealOperation();
LeftCommand leftCommand =
new LeftCommand(realOperation);
RightCommand rightCommand =
new RightCommand(realOperation);
FallCommand fallCommand =
new FallCommand(realOperation);
TransFormCommand transFormCommand =
new TransFormCommand(realOperation);
Commander commander =
new Commander();
commander.setLeftCommand(leftCommand);
commander.setRightCommand(rightCommand);
commander.setFallCommand(fallCommand);
commander.setTransFormCommand(transFormCommand);
commander.toLeft();
commander.toRight();
commander.fall();
commander.transForm();
}
3.总结
1.优点 命令模式的封装性很好,更弱的耦合性,更灵活的控制性以及更好的扩展性。 2.缺点 类的膨胀,大量衍生类的创建。
转载请注明原文地址: https://ju.6miu.com/read-35928.html