常用设计模式----命令模式

package org.design.patterns;

import java.util.List;

/**
 * 命令模式: 将"请求"封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。 命令模式 也支持undo、redo操作。
 */
// 命令的顶层接口
public interface Command {
 public void execute();
}

// 命令的实现
class CommandImp1 implements Command {

 Receiver receiver;

 public CommandImp1(Receiver receiver) {
  this.receiver = receiver;
 }

 @Override
 public void execute() {
  receiver.action();
 }
}

// class CommandImp2 implements Command {
// //...
// }

// 命令实际执行者的顶层接口
interface Receiver {
 public void action();
}

// 命令执行者1
class ReceiverImp1 implements Receiver {
 @Override
 public void action() {
  System.out.println("ReciverImp1 actoin!");
 }
}

// 命令执行者2
class ReceiverImp2 implements Receiver {
 @Override
 public void action() {
  System.out.println("ReciverImp2 actoin!");
 }
}

// 调用CommandImp1命令
// new CommandImp1(new ReceiverImp1());
class SimpleControl {
 Command command;

 public SimpleControl() {
 }

 public void setCommand(Command command) {
  this.command = command;
 }

 public void doString() {
  command.execute();
 }
}

// ====================================================
// 支持撤销的命令接口,其实现类也要实现undo操作即可,支持undo,redo操作就是用两个命令栈,
// 在java中栈可以通过LinkedList模拟,这里暂不详述。
interface Command1 {
 void execute();

 void undo();
}

// ======================================================
// 宏命令的实现:就是制造一种新的命令,用来执行其他的一堆命令,而不是一个命令。
class MacroCommand implements Command {
 List<Command> commandList;// 一个命令集合

 public MacroCommand(List<Command> commandList) {
  this.commandList = commandList;
 }

 @Override
 public void execute() {
       for(Command cmd:commandList){
        cmd.execute();
       }
 }
// public void undo();
}
//==========================================================
/*
 * 要点:
 * -命令模式将请求对象和被请求对象解耦
 * -在解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接受者和一组动作
 * 
 * 命令模式的更多用途:队列请求、日志请求。
 *
 *命令可以将运算块打包(一个接受者和一组动作),然后将它传来传去,就像一般的对象一样。
 *即使在命令被创建很久后,运算依然可以被调用。当然也可在不同的线程中被调用。于是可以
 *根据这样的特性将其应用到如 日程安排(Scheduler)、线程池、工作队列等。
 *
 *工作队列;在队列中添加命令,然后在线程从队列中取出命令执行(execute()),调用完成后
 *丢弃该命令,再取出下一个命令 ...,这就实现了工作队列类和实际运算对象的解耦,线程只需调用
 *execute方法,而无需知道该命令的具体实现。
 *
 *日志请求:
 *某些应用(如web服务器)需要将所有的动作记录到日志中,并能在系统死机后,重新调用这些动作
 *恢复到之前的状态。通过在Command中新增两个方法store()/load(),命令模式就能够支持这一点。
 *在Java中,可以利用对象的序列化(Serialization)实现这些方法。
 *
 */

你可能感兴趣的:(设计模式)