设计模式-命令模式

本文通过实例介绍了命令模式在餐饮场景中的应用,服务员作为调用者,厨师作为接收者。命令模式将制作早餐的动作封装为命令对象,降低了服务员与厨师之间的耦合,使得服务员只需调用命令对象执行即可,无需关心具体制作细节。具体命令类包括河粉和馄饨制作命令,厨师根据命令执行相应操作。

调用者发送一个请求,接收者执行请求来实现具体逻辑。 为了解耦,我们将请求封装成一个命令对象。请求者只需要调用命令即可,无需关心调用接收者的哪一个方法 如何实现!   这样,请求者可以同时调用多个命令。

角色:

抽象命令类(Command):声明执行命令的接口,拥有执行命令的抽象方法 execute()。

具体命令类(Concrete Command):抽象命令类的具体实现类,拥有接收者对象,调用接收者的功能来完成具体操作。

接收者(Receiver):命令对象会绑定并调用它来执行具体逻辑。

调用者(Invoker):调用命令对象的execute()。

例子:客户去餐馆吃早餐,早餐分为很多,如河粉和馄饨等。  服务员收集到订单后,一起提交给厨师,厨师来具体实现。 对于服务员,并不关心如何实现。  用命令模式:

抽象命令类: 制作早餐的命令

具体命令类: 河粉、 馄饨

接收者:厨师

调用者: 服务员

接收者:厨师,他知道具体的制作逻辑

/**
 * 早餐制作
 */
public interface BreakFastCooker {

    /**
     * 制作早餐
     */
    void cooking();
}


/**
 * 制作馄饨
 */
public class HunTunCooker implements BreakFastCooker {

    @Override
    public void cooking() {
        System.out.println("现在开始炒馄饨了");
    }
}


/**
 * 制作河粉
 */
public class HefenCooker implements BreakFastCooker {

    @Override
    public void cooking() {
        System.out.println("现在开始炒河粉了");
    }
}

这时,假如由调用者(服务员)直接找每个接收者(厨师)去制作,耦合性很高,服务员必须知道调用哪个厨师的哪个方法。  这时为了解耦,将早餐制作封装为命令对象,服务员只需要调用命令对象的execute();

/**
 * 制作早餐的命令
 */
public interface Command {

    /**
     * 制作早餐
     */
    void execute();

}


/**
 * 制作河粉的命令
 */
public class HeFenCommand implements Command{

    private HefenCooker hefenCooker;

    public HeFenCommand(){
        this.hefenCooker = new HefenCooker();
    }
    @Override
    public void execute() {
        hefenCooker.cooking();
    }
}


/**
 * 制作馄饨的命令
 */
public class HunTunCommand implements Command{

    private HunTunCooker hunTunCooker;

    public HunTunCommand(){
        this.hunTunCooker = new HunTunCooker();
    }
    @Override
    public void execute() {
        hunTunCooker.cooking();
    }
}

此时,调用者只需创建不同的订单命令,执行命令即可。

/**
 * 服务员:调用者
 */
public class Waiter {

    private List<Command> commandList;

    public Waiter(){
        commandList = new ArrayList<>();
    }

    /**
     * 创建订单
     * @param command
     */
    public void createOrder(Command command){
        commandList.add(command);
    }

    /**
     * 提交订单
     */
    public void submitOrders(){
        for (Command command : commandList) {
            command.execute();
        }
    }

}

测试:

/**
 * 测试类
 */
public class TestDesign {

    public static void main(String[] args) {
        //调用者:服务员
        Waiter waiter = new Waiter();
        //客人点河粉,服务员创建订单
        Command heFenCommand = new HeFenCommand();
        waiter.createOrder(heFenCommand);
        //客人点馄饨,服务员创建订单
        Command hunTunCommand = new HunTunCommand();
        waiter.createOrder(hunTunCommand);

        //服务员提交订单
        waiter.submitOrders();
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值