命令模式
louzhedong opened this issue · comments
Miracle commented
命令模式
高内聚
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
优点:
类间解耦
可扩展性
缺点:
命令很多的时候会非常膨胀
实现
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);