以下内容摘抄于《C#大话设计模式》
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式的结构图如下:
代码如下:
package com.schema.command;
public class Receiver {
public void Action(){
System.out.println("执行请求!");
}
}
package com.schema.command;
public abstract class Command {
protected Receiver receive;
public Command(Receiver receive){
this.receive = receive;
}
public abstract void Execute();
}
package com.schema.command;
public class ConcreteCommand extends Command{
public ConcreteCommand(Receiver receiver){
super(receiver);
}
public void Execute(){
receive.Action();
}
}
package com.schema.command;
public class Invoker {
private Command command;
public void SetCommand(Command command){
this.command = command;
}
public void ExcuteCommand(){
command.Execute();
}
}
package com.schema.command;
public class AppMain {
public static void main(String[] args) {
Receiver r = new Receiver();
Command c = new ConcreteCommand(r);
Invoker i = new Invoker();
i.SetCommand(c);
i.ExcuteCommand();
}
}
下面以烤肉店的运转模式为例:
首先是烤肉师傅,烤肉师傅会烤羊肉串和鸡翅。
package com.schema.command;
public class Barbecuer {
// 烤羊肉
public void BakeMutton(){
System.out.println("烤羊肉串!");
}
// 烤鸡翅
public void BakeChickenWing(){
System.out.println("烤鸡翅!");
}
}
然后是服务抽象类:
package com.schema.command;
public abstract class Service {
protected Barbecuer barbecuer;
public Service(Barbecuer barbecuer){
this.barbecuer = barbecuer;
}
public abstract void Excute();
}
具体的服务类有烤肉服务和烤鸡翅服务:
package com.schema.command;
public class BakeMuttonService extends Service {
public BakeMuttonService(Barbecuer b){
super(b);
}
public void Excute(){
this.barbecuer.BakeMutton();
}
}
package com.schema.command;
public class BakeChickenWingService extends Service {
public BakeChickenWingService(Barbecuer b){
super(b);
}
public void Excute(){
this.barbecuer.BakeChickenWing();
}
}
服务员类
package com.schema.command;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
public class Waiter {
private List<Service> orders = new LinkedList<Service>();
// 添加顾客点菜的菜单
public void SetOrder(Service service){
orders.add(service);
System.out.println("增加订单:" + service.toString() + " 时间:" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
}
// 取消某个菜
public void CancelOrder(Service s){
orders.remove(s);
System.out.println("取消订单:" + s.toString() + " 时间:" + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:").format(new Date()));
}
// 顾客点菜完毕,通知做菜
public void Notify(){
for(Service s : orders){
s.Excute();
}
}
}
客户端:
package com.schema.command;
public class AppMain {
public static void main(String[] args) {
Barbecuer boy = new Barbecuer();
Service s1 = new BakeMuttonService(boy);
Service s2 = new BakeChickenWingService(boy);
Waiter girl = new Waiter();
girl.SetOrder(s1);
girl.SetOrder(s1);
girl.SetOrder(s1);
girl.SetOrder(s2);
girl.Notify();
}
}