设计模式学习之——命令模式
定义:
命令模式:将一个请求封装为一个对象,从而使你可用冉的请求对客户进行参数化;对请求排队或记录请求日志,以及支持课撤销的操作。
|
UML:
命令模式涉及到五个角色,它们分别是:
● 客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
● 命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
● 具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
● 请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
● 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
优点:
|
实例:
主要实现功能:客户打算要点两次烤羊肉,一次烤鸡肉。
package com.zcr.Command; //烧烤人员 public class Barbecuer { //烤羊肉 public void BakeMutton() { System.out.println("烤羊肉!!"); } //烤鸡翅 public void BakeChickenWing() { System.out.println("烤鸡翅!!"); } }
抽象命令类
package com.zcr.Command; public abstract class Command { protected Barbecuer receiver; public Command() { } public Command(Barbecuer barbecuer) { this.receiver = barbecuer; } //执行命令 abstract public void ExcuteCommand(); }
具体命令类
package com.zcr.Command; //烤鸡翅命令 public class BakeChickenWingCommand extends Command { public BakeChickenWingCommand(Barbecuer barbecuer) { //receiver 来自父类 receiver = barbecuer; } @Override public void ExcuteCommand() { receiver.BakeChickenWing(); } }
具体命令类
package com.zcr.Command; //烤羊肉命令 public class BakeMuttonCommand extends Command { public BakeMuttonCommand(Barbecuer barbecuer) { //receiver 来自父类 receiver = barbecuer; } @Override public void ExcuteCommand() { receiver.BakeMutton(); } }
服务员类
package com.zcr.Command; public class Waiter { private Command command; //设置订单 public void SetOrder(Command command) { this.command = command; } //通知执行 public void Notify() { command.ExcuteCommand(); } }
package com.zcr.Command; public class TestCommand { public static void main(String[] args) { //开店前准备,烧烤店实现就找好了烤肉厨师,服务员和烤肉菜单没等客户上门 Barbecuer boy = new Barbecuer(); Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); Command bakeMuttonCommand2 = new BakeMuttonCommand(boy); Command bakeChiCommand = new BakeChickenWingCommand(boy); Waiter girl = new Waiter(); //开门营业, girl.SetOrder(bakeMuttonCommand1); girl.Notify(); girl.SetOrder(bakeMuttonCommand2); girl.Notify(); girl.SetOrder(bakeChiCommand); girl.Notify(); } }