经典的设计模式14——命令模式

文章目录

  • 命令模式


命令模式

定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开,这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。
结构:
抽象命令类角色(command):定义命令的接口,生命执行的方法
具体命令角色(concreteCommand):具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
实现者/接收者角色(receiver):接收者,真正执行命令的对象,任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
调用者/请求者(invoker)角色:要求命令对象执行请求,通常会持有命令对象,可以持有很对的命令对象。这个是客户端真正触发命令并且要求要执行的相应操作的地方,相当于使用命令对象的接口。
命令模式可以和备忘录模式结合支持撤销操作。
应用场景:
1.请求队列化
2.支持取消操作
3.当系统崩溃,能把对系统的操作功能重新执行一遍
4.在需要事务的系统
本质:封装请求
优点
降低系统的耦合度。命令模式能够将调用操作的对象与实现该操作的对象解耦。
增加或删除命令非常方便。采用命令模式,增加与删除命令不会影响其他类,它满足开闭原则,对扩展比较灵活。
可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
方便实现undo和redo操作。命令模式可以和备忘录模式结合,实现命令的撤销与恢复。
使用场景:
系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
系统需要在不同的时间指定请求、将请求排队和执行请求。
系统需要undo和redo操作。
点餐案例:(还有个组装电脑的案例)

package 命令模式;

import java.util.ArrayList;
import java.util.List;

public class waiter {
	private List<command> orders = new ArrayList<command>();

	public void setorder(command c) {
		orders.add(c);
	}

	public void removeorder(command c) {
		orders.remove(c);
	}

	public void Notify() {
		for (int i = 0; i < orders.size(); i++) {
			command c = orders.get(i);
			c.excutecommand();
		}
	}
}

package 命令模式;

public abstract class command {
	protected barbecure receiver;

	public command(barbecure receiver) {
		this.receiver = receiver;
	}

	public abstract void excutecommand();

}

package 命令模式;

public class barbecure {
	public void kaoyangrou() {
		System.out.println("烤羊肉串");
	}

	public void kaojichi() {
		System.out.println("烤鸡翅");
	}
}

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