命令模式就是将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
一般命令模式由四类组成:
简单的可以理解为下订单,比如我在茶百道点了一杯杨枝甘露,在一点点点了一杯椰果奶茶,又在书亦烧仙草点了一杯烧仙草,如果我一个个的去买就会很麻烦,但是如果我在美团下单,他们制作好了,让跑腿小哥取回来,就会方便很多了,也把我们和几个店铺进行了解耦,并且再下单之前,还可以很方便的取消订单。
=========================================================================
那么我们来实现一下上面的例子:
首先我们定义抽象命令类角色:也就是奶茶店的角色,奶茶店负责实现做奶茶的方法:
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 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();
}
}
优点:
缺点: