设计模式 – 命令模式(Command)

来源:互联网 发布:android 消息推送 知乎 编辑:程序博客网 时间:2024/06/04 19:27

ü  核心:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作;

ü  优点1、他能够容易地设计一个命令队列;2、在需要的情况下,可以较容易地将命令计入日志;3、允许接收请求的一方决定是否要否决请求;4、可以容易地实现对请求的撤销和重做;5、由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易;6(最关键的)将请求一个操作的对象与知道怎么执行一个操作的对象分隔开;

ü  结构图

实例:烧烤店经营方式的模拟

Ø  烧烤员Baker 文件Baker.java

package com.yilong.designpattern.command.bake;

public class Baker {

    public void bakeMutton(int amount) {

       for(int i=0; i<amount; i++) {

           System.out.println("烤羊肉串!");

       }

    }

    public void bakeChickenWing(int amount) {

       for(int i=0; i<amount; i++) {

           System.out.println("烤鸡翅!");

       }

    }

}

Ø  命令的抽象类 文件Command.java

package com.yilong.designpattern.command.bake;

public abstract class Command {

    Baker baker;

    int amount;

    public Command(Baker baker) {

       this.baker = baker;

    }

    public void setAmount(int amount) {

       this.amount = amount;

    }

    public abstract void displayCommand();

    public abstract void execute();

}

Ø  烤羊肉串的命令类 文件BakeMuttonCommand.java

package com.yilong.designpattern.command.bake;

public class BakeMuttonCommand extends Command {

    public BakeMuttonCommand(Baker baker) {

       super(baker);

    }

    @Override

    public void execute() {

       this.baker.bakeMutton(this.amount);

    }

    @Override

    public void displayCommand() {

       System.out.println("烤羊肉串!份数:" + this.amount);

    }

}

Ø  烤鸡翅的命令类 文件BakeChickenCommand.java

package com.yilong.designpattern.command.bake;

public class BakeChickenWingCommand extends Command {

    public BakeChickenWingCommand(Baker baker) {

       super(baker);

    }

    @Override

    public void execute() {

       this.baker.bakeChickenWing(this.amount);

    }

    @Override

    public void displayCommand() {

       System.out.println("烤鸡翅!份数:" + this.amount);

    }

}

Ø  服务员类   文件Waiter.java

package com.yilong.designpattern.command.bake;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class Waiter {

    List<Command> commands = new ArrayList<Command>();

    public void setOrder(Command command) {

       int orderNum = commands.size() + 1;

       System.out.print("订单" + orderNum + ": ");

       command.displayCommand();

       commands.add(command);

    }

    public void giveOrder() {

       Iterator commandIterator = commands.iterator();

       while(commandIterator.hasNext()) {

           Command c = (Command)commandIterator.next();

           c.execute();

       }

       commands.removeAll(commands);

    }

}

Ø  测试类 – Client.java

package com.yilong.designpattern.command.bake;

public class Client {

    public static void main(String[] args) {

       System.out.println("----- 营业前的准备 -----");

       System.out.println("1、指定厨师!");

       Baker baker = new Baker();

       Command command1 = new BakeMuttonCommand(baker);

       Command command2 = new BakeChickenWingCommand(baker);

       System.out.println("2、指定服务员!");

       Waiter waiter = new Waiter();

       System.out.println("-----   开门营业 -----");

       System.out.println("1、接待客人!");

       System.out.println("2、服务员写订单 -----");

       command1.setAmount(5);

       command2.setAmount(3);

       waiter.setOrder(command1);

       waiter.setOrder(command2);

       System.out.println("----- 厨师工作中 -----");

       waiter.giveOrder();

    }

}

打印结果:

----- 营业前的准备 -----

1、指定厨师!

2、指定服务员!

-----   开门营业 -----

1、接待客人!

2、服务员写订单 -----

订单1: 烤羊肉串!份数:5

订单2: 烤鸡翅!份数:3

----- 厨师工作中 -----

烤羊肉串!

烤羊肉串!

烤羊肉串!

烤羊肉串!

烤羊肉串!

烤鸡翅!

烤鸡翅!

烤鸡翅!

原创粉丝点击