louzhedong / blog

前端基础,深入以及算法数据结构

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

命令模式

louzhedong opened this issue · comments

命令模式

高内聚

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能

优点:

类间解耦

可扩展性

缺点:

命令很多的时候会非常膨胀

实现
Java
public abstract class Receiver {
    public abstract void doSomething();
}

/**
 * 具体接受者
 **/
public class ConcreteReceiver extends Receiver{
    @Override
    public void doSomething() {

    }
}

public abstract class Command {
    public abstract void execute();
}

/**
 * 具体命令类
 **/
public class ConcreteCommand extends Command{
    private Receiver receiver;

    public ConcreteCommand(Receiver _receiver) {
        this.receiver = _receiver;
    }

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

/**
 * 调用者
 **/
public class Invoker {
    private Command command;

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

    public void action() {
        this.command.execute();
    }
}

public class Client {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();

        Receiver receiver = new ConcreteReceiver();

        Command command = new ConcreteCommand(receiver);

        invoker.setCommand(command);
        invoker.action();
    }
}
JavaScript
var setCommand = function(button, command) {
  button.onclick = function() {
    command.execute();
  }
}

var MenuBar = {
  refresh: function () {
    console.log('refresh');
  }
}

var SubMenu = {
  add: function () {
    console.log('add');
  }
}

var RefreshMenuBarCommand = function (receiver) {
  this.receiver = receiver;
}
RefreshMenuBarCommand.prototype.execute = function () {
  this.receiver.refresh();
}

var AddSubMenuCommand = function (receiver) {
  this.receiver = receiver;
}
AddSubMenuCommand.prototype.execute = function() {
  this.receiver.add();
}

var refreshMenuBarCommand = new RefreshMenuBarCommand(MenuBar);
var addSubMenuCommand = new AddSubMenuCommand(SubMenu);

setCommand(button1, refreshMenuBarCommand);
setCommand(button2, addSubMenuCommand);