《设计模式入门》 19.命令模式

命令模式就是将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

一般命令模式由四类组成:

  1. 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。
  2. 具体命令角色(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
  3. 实现者/接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
  4. 调用者/请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

简单的可以理解为下订单,比如我在茶百道点了一杯杨枝甘露,在一点点点了一杯椰果奶茶,又在书亦烧仙草点了一杯烧仙草,如果我一个个的去买就会很麻烦,但是如果我在美团下单,他们制作好了,让跑腿小哥取回来,就会方便很多了,也把我们和几个店铺进行了解耦,并且再下单之前,还可以很方便的取消订单。

=========================================================================

那么我们来实现一下上面的例子:

首先我们定义抽象命令类角色:也就是奶茶店的角色,奶茶店负责实现做奶茶的方法:

package BehavioralPatterns.CommandPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName TeaShop.java
 * @Description 奶茶店接口
 * @createTime 2022年03月16日 14:46:00
 */
public interface TeaShop {
    /**
     * 做奶茶
     */
    public void makeTea();
}

然后我们定义三个具体的奶茶店,来实现奶茶店的接口,店铺可以接受订单做奶茶:

茶百道:

package BehavioralPatterns.CommandPattern.shop;

import BehavioralPatterns.CommandPattern.Drink;
import BehavioralPatterns.CommandPattern.TeaShop;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName ChaBaiDao.java
 * @Description 茶百道类
 * @createTime 2022年03月16日 14:56:00
 */
public class ChaBaiDao implements TeaShop {
    private Drink drink;

    public ChaBaiDao(Drink drink){
        this.drink = drink;
    }
    @Override
    public void makeTea() {
        drink.drink();
    }
}

书亦:

package BehavioralPatterns.CommandPattern.shop;

import BehavioralPatterns.CommandPattern.Drink;
import BehavioralPatterns.CommandPattern.TeaShop;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName ShuYi.java
 * @Description 书亦烧仙草类
 * @createTime 2022年03月16日 14:54:00
 */
public class ShuYi implements TeaShop {
    private Drink drink;

    public ShuYi(Drink drink){
        this.drink = drink;
    }

    @Override
    public void makeTea() {
        drink.drink();
    }
}

一点点:

package BehavioralPatterns.CommandPattern.shop;

import BehavioralPatterns.CommandPattern.Drink;
import BehavioralPatterns.CommandPattern.TeaShop;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName YiDianDian.java
 * @Description 一点点类
 * @createTime 2022年03月16日 14:57:00
 */
public class YiDianDian implements TeaShop {
    private Drink drink;

    public YiDianDian(Drink drink){
        this.drink = drink;
    }

    @Override
    public void makeTea() {
        drink.drink();
    }
}

然后定义一个饮料接口,来真实的实现具体的饮料制作:

package BehavioralPatterns.CommandPattern;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName Drink.java
 * @Description 饮料接口
 * @createTime 2022年03月16日 14:49:00
 */
public interface Drink {
    /**
     * 实现饮料制作
     */
    public void drink();
}

具体的奶茶制作:

椰果奶茶:

package BehavioralPatterns.CommandPattern.drink;

import BehavioralPatterns.CommandPattern.Drink;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName CoconutMilkTea.java
 * @Description 椰果奶茶类
 * @createTime 2022年03月16日 14:52:00
 */
public class CoconutMilkTea implements Drink {
    @Override
    public void drink() {
        System.out.println("椰果奶茶做好了");
    }
}

烧仙草:

package BehavioralPatterns.CommandPattern.drink;

import BehavioralPatterns.CommandPattern.Drink;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName HerbalJelly.java
 * @Description 烧仙草类
 * @createTime 2022年03月16日 14:53:00
 */
public class HerbalJelly implements Drink {
    @Override
    public void drink() {
        System.out.println("烧仙草做好了");
    }
}

杨枝甘露:

package BehavioralPatterns.CommandPattern.drink;

import BehavioralPatterns.CommandPattern.Drink;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName YojiNectar.java
 * @Description 杨枝甘露类
 * @createTime 2022年03月16日 14:51:00
 */
public class YojiNectar implements Drink {
    @Override
    public void drink() {
        System.out.println("杨枝甘露做好了");
    }
}

之后创建一个美团订单中心,实现总的订单添加删除以及下单功能,负责与奶茶店交互,避免了下订单的人喝奶茶店交互。

package BehavioralPatterns.CommandPattern;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName OrderCenter.java
 * @Description 订单中心
 * @createTime 2022年03月16日 14:58:00
 */
public class OrderCenter {
    private List<TeaShop> orderList = new ArrayList<>();

    /**
     * 添加订单
     * @param teaShop 奶茶店订单
     * @return 是否添加成功
     */
    public boolean addOrder(TeaShop teaShop){
        return orderList.add(teaShop);
    }

    /**
     * 
     * @param teaShop 奶茶店订单
     * @return 是否删除成功
     */
    public boolean removeOrder(TeaShop teaShop){
        return orderList.remove(teaShop);
    }
    /**
     * 下单
     */
    public synchronized void placeOrder(){
        for (TeaShop teashop:orderList) {
            teashop.makeTea();
        }
        orderList.clear();
    }
}

测试一下:

package BehavioralPatterns.CommandPattern;

import BehavioralPatterns.CommandPattern.drink.CoconutMilkTea;
import BehavioralPatterns.CommandPattern.drink.HerbalJelly;
import BehavioralPatterns.CommandPattern.drink.YojiNectar;
import BehavioralPatterns.CommandPattern.shop.ChaBaiDao;
import BehavioralPatterns.CommandPattern.shop.ShuYi;
import BehavioralPatterns.CommandPattern.shop.YiDianDian;

/**
 * @author Zeyu Wan
 * @version 1.0.0
 * @ClassName CommonTest.java
 * @Description 测试类
 * @createTime 2022年03月16日 15:02:00
 */
public class CommonTest {
    public static void main(String[] args) {
        //茶百道点杨枝甘露
        ChaBaiDao chaBaiDaoOrder = new ChaBaiDao(new YojiNectar());
        //书亦烧仙草点烧仙草
        ShuYi shuYiOrder = new ShuYi(new HerbalJelly());
        //一点点点椰果奶茶
        YiDianDian yiDianDianOrder = new YiDianDian(new CoconutMilkTea());

        //创建订单并添加商品
        OrderCenter userOrder = new OrderCenter();

        if (userOrder.addOrder(chaBaiDaoOrder)){
            System.out.println("商品添加成功");
        }
        if (userOrder.addOrder(shuYiOrder)){
            System.out.println("商品添加成功");
        }
        if (userOrder.addOrder(yiDianDianOrder)){
            System.out.println("商品添加成功");
        }
        //不想要一点点的订单了
        if (userOrder.removeOrder(yiDianDianOrder)){
            System.out.println("商品删除成功");
        }

        //下订单
        userOrder.placeOrder();
    }
}

 

优点:

  1. 降低系统的耦合度:命令模式将调用操作的对象与知道如何实现该操作的对象解耦。
  2. 命令是头等的对象。它们可像其他的对象一样被操纵和扩展。
  3. 组合命令:你可将多个命令装配成一个组合命令,即可以比较容易地设计一个命令队列和宏命令。一般说来,组合命令是组合模式的一个实例。
  4. 增加新的命令很容易,因为这无需改变已有的类。
  5. 可以方便地实现对请求的Undo和Redo。

缺点:

  • 使用命令模式可能会 导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PigeonEssence

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值