命令模式--把需求记录在案,让事务灵活可变(行为模式02)

什么是命令模式
将单个请求封装成单个对象,客户端可调用不同请求完成任务。对请求有所记录,或可支持撤销等操作。

命令模式的适用场景
需要支持事务操作。
需要有类似于日志记录的功能,可在执行之前做修改操作,或意外丢失可执行恢复工作。
抽象出需要执行的动作,以参数的形式提供给命令者。

命令模式的角色
Receiver:接收者角色。执行具体逻辑的角色。
Command:命令角色,定义总的命令抽象接口。
ConcreteCommand:具体命令角色,Command的具体实现。
Invoker:请求者角色,调用命令对象执行确定的请求。
Client:客户端角色。

命令模式用例
我们到餐厅聚餐,餐厅有服务员,厨师等角色,我们点餐,服务员记录在案,我们还可以反悔,取消点过的菜品,只要在厨师未做之前就可以的,而我们点菜并未与厨师联系,服务员相当于Invoker角色,产品确定后向厨师Receiver发送命令。

UML类图
这里写图片描述

服务员Waiter类:

public class Waiter {
    //模仿记录菜单的列表
    private ArrayList<AbstractCommand> acs = new ArrayList<AbstractCommand>();
    public void addCommand(AbstractCommand ac){
        acs.add(ac);
    }

    public void deleteCommand(AbstractCommand ac){
        acs.remove(ac);
    }

    public void notifyCook(){
        System.out.println("您的菜单是:");
        for(AbstractCommand ac:acs){
            System.out.println(ac.makeFood());
        }
    }
}

抽象类AbstractCommand:

public abstract class AbstractCommand {
    public abstract String makeFood();
}

具体类MeatCommand:

public class MeatCommand extends AbstractCommand {

    @Override
    public String makeFood() {
        return "香喷喷的烤肉!";
    }

}

具体类CakeCommand:

public class CakeCommand extends AbstractCommand {

    @Override
    public String makeFood() {
        return "可口的蛋糕!";
    }

}

测试类:

public class Test {

    public static void main(String[] args) {
        CakeCommand cake = new CakeCommand();
        MeatCommand meat = new MeatCommand();

        Waiter waiter = new Waiter();

        //添加两个菜品
        waiter.addCommand(cake);
        waiter.addCommand(meat);

        //考虑后觉得吃不了取消一个
        waiter.deleteCommand(cake);

        //通知后厨做菜
        waiter.notifyCook();
    }

}

运行结果:

您的菜单是:
香喷喷的烤肉!

命令模式总结
命令模式其实就是通过中间人的记录,来把要求者的请求记录在案,记录可更改操作,确认后统一交付执行者。
优点:更低的耦合度,灵活控制和易扩展性。可记录命令执行的结构,方便补救措施施行。
缺点:类比较庞大,大量衍生类的创建,如果我有成千上万种食物,那么这样下来整个系统会很雍容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值