《设计模式入门》 19.命令模式
命令模式就是將一個請求封裝為一個對象,使發(fā)出請求的責(zé)任和執(zhí)行請求的責(zé)任分割開。這樣兩者之間通過命令對象進(jìn)行溝通,這樣方便將命令對象進(jìn)行儲存、傳遞、調(diào)用、增加與管理。
一般命令模式由四類組成:
簡單的可以理解為下訂單,比如我在茶百道點(diǎn)了一杯楊枝甘露,在一點(diǎn)點(diǎn)點(diǎn)了一杯椰果奶茶,又在書亦燒仙草點(diǎn)了一杯燒仙草,如果我一個個的去買就會很麻煩,但是如果我在美團(tuán)下單,他們制作好了,讓跑腿小哥取回來,就會方便很多了,也把我們和幾個店鋪進(jìn)行了解耦,并且再下單之前,還可以很方便的取消訂單。
=========================================================================
那么我們來實現(xiàn)一下上面的例子:
首先我們定義抽象命令類角色:也就是奶茶店的角色,奶茶店負(fù)責(zé)實現(xiàn)做奶茶的方法:
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(); }然后我們定義三個具體的奶茶店,來實現(xiàn)奶茶店的接口,店鋪可以接受訂單做奶茶:
茶百道:
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;}@Overridepublic 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;}@Overridepublic void makeTea() {drink.drink();} }一點(diǎn)點(diǎn):
package BehavioralPatterns.CommandPattern.shop;import BehavioralPatterns.CommandPattern.Drink; import BehavioralPatterns.CommandPattern.TeaShop;/*** @author Zeyu Wan* @version 1.0.0* @ClassName YiDianDian.java* @Description 一點(diǎn)點(diǎn)類* @createTime 2022年03月16日 14:57:00*/ public class YiDianDian implements TeaShop {private Drink drink;public YiDianDian(Drink drink){this.drink = drink;}@Overridepublic void makeTea() {drink.drink();} }然后定義一個飲料接口,來真實的實現(xiàn)具體的飲料制作:
package BehavioralPatterns.CommandPattern;/*** @author Zeyu Wan* @version 1.0.0* @ClassName Drink.java* @Description 飲料接口* @createTime 2022年03月16日 14:49:00*/ public interface Drink {/*** 實現(xiàn)飲料制作*/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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void drink() {System.out.println("楊枝甘露做好了");} }之后創(chuàng)建一個美團(tuán)訂單中心,實現(xiàn)總的訂單添加刪除以及下單功能,負(fù)責(zé)與奶茶店交互,避免了下訂單的人喝奶茶店交互。
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) {//茶百道點(diǎn)楊枝甘露ChaBaiDao chaBaiDaoOrder = new ChaBaiDao(new YojiNectar());//書亦燒仙草點(diǎn)燒仙草ShuYi shuYiOrder = new ShuYi(new HerbalJelly());//一點(diǎn)點(diǎn)點(diǎn)椰果奶茶YiDianDian yiDianDianOrder = new YiDianDian(new CoconutMilkTea());//創(chuàng)建訂單并添加商品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("商品添加成功");}//不想要一點(diǎn)點(diǎn)的訂單了if (userOrder.removeOrder(yiDianDianOrder)){System.out.println("商品刪除成功");}//下訂單userOrder.placeOrder();} }?
優(yōu)點(diǎn):
缺點(diǎn):
- 使用命令模式可能會 導(dǎo)致某些系統(tǒng)有過多的具體命令類。因為針對每一個命令都需要設(shè)計一個具體命令類,因此某些系統(tǒng)可能需要大量具體命令類,這將影響命令模式的使用。
總結(jié)
以上是生活随笔為你收集整理的《设计模式入门》 19.命令模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 定位和地图
- 下一篇: 去除latex中cctbook里面二级章