命令模式

来源:互联网 发布:买家如何避免淘宝客 编辑:程序博客网 时间:2024/06/06 16:38

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

就是将请求封装装起来,对请求的操作就只需要操作这个对象就行了;

我的理解是:前提是被请求者有多种功能,比如说烧烤摊主,即能烤肉又能拷鸡翅,但是每个顾客的要求又不一样。就必须对烧烤摊主的功能分开封装,然后用一个类来管理。

最先肯定有烧烤摊主这个类:

public class Barbecuer {    public void bakeMutton() {        System.out.println("烤肉串");    }    public void bakeChickenWing() {        System.out.println("烤鸡翅");    }}

如果顾客都直接操作这个类,烧烤摊主肯定分不清谁是谁,估计就会疯了。

那么我们将烧烤摊主的功能都独立出来,用一个命令接口管理

public abstract class Command {    protected Barbecuer receiver;    public Command(Barbecuer receiver) {        this.receiver = receiver;    }    public abstract void ExcuteCommand();}

不同的功能都分出来封装:

public class BakeMuttonCommand extends Command {    public BakeMuttonCommand(Barbecuer receiver) {        super(receiver);    }    @Override    public void ExcuteCommand() {        receiver.bakeMutton();    }}
public class BakeChickenWingCommand extends Command {    public BakeChickenWingCommand(Barbecuer receiver) {        super(receiver);    }    @Override    public void ExcuteCommand() {        receiver.bakeChickenWing();    }}

然后由服务员来管理顾客的点单,即由一个类来管理烧烤摊主该烤什么,这就是前面将摊主的功能都分离出来的好处。

public class Waiter {    private List<Command> orders = new ArrayList<Command>();    public void setOrder(Command command) {        orders.add(command);    }    public void cancelOrder(Command command) {        orders.remove(command);    }    public void notifier() {        for (Command command : orders) {            command.ExcuteCommand();        }    }}

主流程代码:

//开店准备Barbecuer boy = new Barbecuer();Command bakeMuttonCommand = new BakeMuttonCommand(boy);Command bakeChickenWingCommand = new BakeChickenWingCommand(boy);                               Waiter girl = new Waiter();//服务员根据客户点单下命令给摊主做什么烧烤girl.setOrder(bakeMuttonCommand);girl.setOrder(bakeMuttonCommand);girl.setOrder(bakeChickenWingCommand);girl.notifier();

现在,如果还需要烤扇贝,那么只需要把摊主的这个技能再封装出来,开店的时候在菜单里加上这一项,顾客点单了服务员命令摊主做就是了。

0 0
原创粉丝点击