zoukankan      html  css  js  c++  java
  • 《设计模式之禅》学习笔记(十五)

    命令模式的定义:

    Encapsulat a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

    命令模式的通用类图:

    三种角色:

    • Receiver 接受者角色,命令传递到这里被执行。
    • Command 命令角色,需要执行的所有命令都在这里声明。
    • Invoker 调用者角色,接受到命令,并执行命令。

    通用代码:

    public abstract class Receiver {
    
    	// 抽象接受者,定义每个接受者都必须完成的任务
    	public abstract void doSomething();
    	
    }
    public class ConcreteReceiver1 extends Receiver {
    
    	@Override
    	public void doSomething() {
    
    	}
    
    }
    public class ConcreteReceiver2 extends Receiver {
    
    	@Override
    	public void doSomething() {
    
    	}
    
    }
    public abstract class Command {
    
    	protected final Receiver receiver;
    	
    	public Command(Receiver receiver) {
    		this.receiver = receiver;
    	}
    	
    	public abstract void execute();
    	
    }
    public class ConcreteCommand1 extends Command {
    	
    	// 声明自己的默认接收者,这样高层次模块(调用者)就不需要知道接受者是谁
    	public ConcreteCommand1() {
    		super(new ConcreteReceiver1());
    	}
    	
    	// 构造函数传递接收者
    	public ConcreteCommand1(Receiver receiver) {
    		super(receiver);
    	}
    	
    	@Override
    	public void execute() {
    		// 业务处理
    		this.receiver.doSomething();
    	}
    
    }
    public class ConcreteCommand2 extends Command {
    	
    	// 声明自己的默认接收者
    	public ConcreteCommand2() {
    		super(new ConcreteReceiver2());
    	}
    	
    	// 构造函数传递接收者
    	public ConcreteCommand2(Receiver receiver) {
    		super(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) {
    		// 声明调用者Receiver
    		Invoker invoker = new Invoker();
    		// 定义一个发送给接受者的命令
    		Command command = new ConcreteCommand1();
    		// 把命令交给调用者去执行
    		invoker.setCommand(command);
    		invoker.action();
    	}
    	
    }
    

    命令模式的优点:

    • 类间解耦
    • 可扩展性
    • 命令模式结合其他模式会更优秀

    命令模式的缺点:

    类膨胀

  • 相关阅读:
    《30天自制操作系统》06_day_学习笔记
    《30天自制操作系统》05_day_学习笔记
    《30天自制操作系统》04_day_学习笔记
    ugui Event.current.mousePosition获取的坐标原点在左上角
    场景中GameObject无法用代码隐藏问题(setActive为false)
    让camera实现类似cs第一人称视角旋转和位移
    itunesconnect如何提交被决绝过了的相同版本号
    mac下安装libpng环境
    golang实现模拟键盘按键
    cocos2d3.x在android下屏蔽多点触控
  • 原文地址:https://www.cnblogs.com/qwertWZ/p/2840857.html
Copyright © 2011-2022 走看看