admin 管理员组文章数量: 1087649
设计模式 命令模式
文章目录
- 命令模式情景
- 命令模式实战
- 不使用命令模式写法
- 使用命令模式写法
命令模式情景
把逻辑实现与操作进行分离, 降低耦合方便扩展. 以数据驱动的方式命令对象, 使用构造函数传递给调用者. 调用者再提供相应的实现为命令执行具体的操作方法.
命令模式实战
模拟在餐厅中点餐交给厨师的场景.
顾客只需点不同的菜系, 店小二把不同的菜系写菜单上, 通过菜单下命令, 不同的厨师进行炒菜.
不使用命令模式写法
public class XiaoEr {private Logger logger = LoggerFactory.getLogger(XiaoEr.class);private Map<Integer, String> cuisineMap = new ConcurrentHashMap<Integer, String>();public void order(int cuisine) {// 广东(粤菜)if (1 == cuisine) {cuisineMap.put(1, "广东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头");}// 江苏(苏菜)if (2 == cuisine) {cuisineMap.put(2, "江苏厨师,烹饪苏菜,宫廷第二大菜系,古今国宴上最受人欢迎的菜系。");}// 山东(鲁菜)if (3 == cuisine) {cuisineMap.put(3, "山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头.");}// 四川(川菜)if (4 == cuisine) {cuisineMap.put(4, "四川厨师,烹饪川菜,中国最有特色的菜系,也是民间最大菜系。");}}public void placeOrder() {logger.info("菜单:{}", JSON.toJSONString(cuisineMap));}
}
直接使用if else 进行判断不同的菜系.
使用命令模式写法
使用命令模式拆解为三大块, 命令实现者(菜品), 具体逻辑实现(厨师), 命令调用者(店小二).
uml图如下 .
抽象命令定义: 菜品接口
public interface ICuisine {// 烹调 制作void cook();
}
具体命令的实现(菜品)
public class GuangDoneCuisine implements ICuisine {private ICook cook;public GuangDoneCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}
}
public class JiangSuCuisine implements ICuisine {private ICook cook;public JiangSuCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}
}
public class ShangDongCuisine implements ICuisine {private ICook cook;public ShangDongCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}
}public class SiChuanCuisine implements ICuisine {// 实现的类中都有添加了一个厨师类(ICook)private ICook cook;public SiChuanCuisine(ICook cook) {this.cook = cook;}public void cook() {// 操作命令(烹饪菜品)cook.doCooking();}
}
抽象实现者接口 (厨师接口 )
public interface ICook {void doCooking();
}
实现者具体实现(四类厨师)
public class GuangDongCook implements ICook {public void doCooking() {System.out.println("广东厨师, 宫廷最大菜系");}
}
public class JiangSuCook implements ICook {public void doCooking() {System.out.println("江苏厨师, 烹饪苏菜,宫廷第二大菜系");}
}public class ShanDongCook implements ICook {public void doCooking() {System.out.println("山东厨师. 鲁味..");}
}public class SiChuanCook implements ICook {public void doCooking() {System.out.println("四川厨师 民间最大菜系");}
}
调用者(小二)
public class XiaoEr {//通过外部将菜品和厨师传递进来而进行具体的调用private List<ICuisine> cuisineList = new ArrayList();public void order(ICuisine cuisine) {// 菜品的添加cuisineList.add(cuisine);}public synchronized void placeOrder() {for (ICuisine cuisine : cuisineList) {// 菜单执行烹饪cuisine.cook();}cuisineList.clear();}
}
测试类
public class ApiTest {@Testpublic void test() {// 菜系 菜品与厨师的组合ICuisine guangDongCuisine = new GuangDongCuisine(new GuangDongCook());ICuisine jiangSuCuisine = new JiangSuCuisine(new JiangSuCook());ICuisine shangDongCuisine = new ShangDongCuisine(new ShanDongCook());ICuisine siChuanCuisine = new SiChuanCuisine(new SiChuanCook());// 点单 由小二进行操作点单,xiaoEr.order(guangDoneCuisine);,这里分别添加了四种菜品,给小二XiaoEr xiaoEr = new XiaoEr();xiaoEr.order(guangDongCuisine);xiaoEr.order(jiangSuCuisine);xiaoEr.order(shangDongCuisine);xiaoEr.order(siChuanCuisine);// 下单 具体命令实现的操作xiaoEr.placeOrder();}
}
测试结果如下
广东厨师, 宫廷最大菜系
江苏厨师, 烹饪苏菜,宫廷第二大菜系
山东厨师. 鲁味…
四川厨师 民间最大菜系
本文标签: 设计模式 命令模式
版权声明:本文标题:设计模式 命令模式 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1700324243a397127.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论