命令模式
2018-07-29 本文已影响4人
fancy_boy_石嘉成
《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern
说明
定义:命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
UML图:
命令模式UML图.png代码实现:
Command类,用来声明执行操作的接口
/**
* Command类,用来声明执行操作的接口
*/
abstract class Command{
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver = receiver;
}
public abstract void Execute();
}
ConcreteCommand类,将一个接收者对象绑定与一个动作,调用接收者相应的操作,以实现Excute
class ConcreteCommand extends Command{
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void Execute() {
receiver.Action();
}
}
Invoker类,要求该命令执行这个请求
class Invoker{
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void excuteCommand(){
command.Execute();
}
}
Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者
class Receiver{
public void Action(){
System.out.println("执行请求");
}
}
客户端代码
public class CommandPattern {
public static void main(String[] args){
Receiver r = new Receiver();
Command c = new ConcreteCommand(r);
Invoker i = new Invoker();
i.setCommand(c);
i.excuteCommand();
}
}
运行结果
执行请求
示例
例子:夏天我们吃烧烤的时候都是烧烤店提前准备好串,然后由烧烤师傅来烤制。我们通过服务员点餐,由服务员告诉烧烤师傅所点的菜。我们也可以通过服务员知道哪些菜没有了。用程序模拟这个过程。
代码实现:
烤肉串者
public class Barbecuer {
public void BakeMutton(){
System.out.println("烤羊肉串");
}
public void BakeChickenWing(){
System.out.println("烤鸡翅");
}
}
抽象命令类
public abstract class BarbecuerCommand {
protected Barbecuer receiver;
public BarbecuerCommand(Barbecuer receiver){
this.receiver =receiver;
}
public abstract void ExcuteCommand();
}
具体命令-烤羊肉串命令
public class BakeMuttonCommand extends BarbecuerCommand {
public BakeMuttonCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void ExcuteCommand() {
receiver.BakeMutton();
}
}
具体命令-烤鸡翅命令
public class BakeChickenWingCommand extends BarbecuerCommand {
public BakeChickenWingCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void ExcuteCommand() {
receiver.BakeChickenWing();
}
}
服务员类
public class Waiter {
private List<BarbecuerCommand> orders = new ArrayList<>();
//设置订单
public void setOrder(BarbecuerCommand command){
if (command instanceof BakeChickenWingCommand){
System.out.println("服务员:鸡翅没有了,请点其他的");
}else {
orders.add(command);
System.out.println("增加订单:羊肉串");
}
}
// 取消订单
public void cancelOrder(BarbecuerCommand command){
orders.remove(command);
}
// 通知全部执行
public void Notify(){
for (int i = 0; i < orders.size(); i++) {
orders.get(i).ExcuteCommand();
}
}
}
客户端代码
public class Main {
public static void main(String[] args){
//开店前准备
Barbecuer boy = new Barbecuer();
BarbecuerCommand bakeMuttonCommand1 = new BakeMuttonCommand(boy);
BarbecuerCommand bakeMuttonCommand2 = new BakeMuttonCommand(boy);
BarbecuerCommand bakeChickenWingCommand = new BakeChickenWingCommand(boy);
Waiter girl = new Waiter();
// 开门营业
girl.setOrder(bakeMuttonCommand1);
girl.setOrder(bakeMuttonCommand2);
girl.setOrder(bakeChickenWingCommand);
// 点菜完毕,通知厨房
girl.Notify();
}
}
运行结果
增加订单:羊肉串
增加订单:羊肉串
服务员:鸡翅没有了,请点其他的
烤羊肉串
烤羊肉串