大家好,欢迎来到IT知识分享网。
3.4 宏命令
- /
- * 厨师的接口
- */
- public interface CookApi {
- /
- * 示意,做菜的方法
- * @param name 菜名
- */
- public void cook(String name);
- }
厨师又分成两类,一类是做热菜的师傅,一类是做凉菜的师傅,先看看做热菜的厨师的实现示意,示例代码如下:
- /
- * 厨师对象,做热菜
- */
- public class HotCook implements CookApi{
- public void cook(String name) {
- System.out.println(“本厨师正在做:”+name);
- }
- }
做凉菜的师傅,示例代码如下:
- /
- * 厨师对象,做凉菜
- */
- public class CoolCook implements CookApi {
- public void cook(String name) {
- System.out.println(“凉菜”+name+“已经做好,本厨师正在装盘。” );
- }
- }
(2)接下来,来定义命令接口,跟以前一样,示例代码如下:
- /
- * 命令接口,声明执行的操作
- */
- public interface Command {
- /
- * 执行命令对应的操作
- */
- public void execute();
- }
- /
- * 命令对象,绿豆排骨煲
- */
- public class ChopCommand implements Command{
- /
- * 持有具体做菜的厨师的对象
- */
- private CookApi cookApi = null;
- /
- * 设置具体做菜的厨师的对象
- * @param cookApi 具体做菜的厨师的对象
- */
- public void setCookApi(CookApi cookApi) {
- this.cookApi = cookApi;
- }
- public void execute() {
- this.cookApi.cook(“绿豆排骨煲”);
- }
- }
(4)该来组合菜单对象了,也就是宏命令对象。
- 首先宏命令就其本质还是一个命令,所以一样要实现Command接口
- 其次宏命令跟普通命令的不同在于:宏命令是多个命令组合起来的,因此在宏命令对象里面会记录多个组成它的命令对象
- 第三,既然是包含多个命令对象,得有方法让这多个命令对象能被组合进来
- 第四,既然宏命令包含了多个命令对象,执行宏命令对象就相当于依次执行这些命令对象,也就是循环执行这些命令对象
看看代码示例会更清晰些,代码示例如下:
- /
- * 菜单对象,是个宏命令对象
- */
- public class MenuCommand implements Command {
- /
- * 用来记录组合本菜单的多道菜品,也就是多个命令对象
- */
- private Collection<Command> col = new ArrayList<Command>();
- /
- * 点菜,把菜品加入到菜单中
- * @param cmd 客户点的菜
- */
- public void addCommand(Command cmd){
- col.add(cmd);
- }
- public void execute() {
- //执行菜单其实就是循环执行菜单里面的每个菜
- for(Command cmd : col){
- cmd.execute();
- }
- }
- }
(5)该服务员类重磅登场了,它实现的功能,相当于标准命令模式实现中的Client加上Invoker,前面都是文字讲述,看看代码如何实现,示例代码如下:
- /
- * 服务员,负责组合菜单,负责组装每个菜和具体的实现者,
- * 还负责执行调用,相当于标准Command模式的Client+Invoker
- */
- public class Waiter {
- /
- * 持有一个宏命令对象——菜单
- */
- private MenuCommand menuCommand = new MenuCommand();
- /
- * 客户点菜
- * @param cmd 客户点的菜,每道菜是一个命令对象
- */
- public void orderDish(Command cmd){
- //客户传过来的命令对象是没有和接收者组装的
- //在这里组装吧
- CookApi hotCook = new HotCook();
- CookApi coolCook = new CoolCook();
- //判读到底是组合凉菜师傅还是热菜师傅
- //简单点根据命令的原始对象的类型来判断
- if(cmd instanceof DuckCommand){
- ((DuckCommand)cmd).setCookApi(hotCook);
- }else if(cmd instanceof ChopCommand){
- ((ChopCommand)cmd).setCookApi(hotCook);
- }else if(cmd instanceof PorkCommand){
- //这是个凉菜,所以要组合凉菜的师傅
- ((PorkCommand)cmd).setCookApi(coolCook);
- }
- //添加到菜单中
- menuCommand.addCommand(cmd);
- }
- /
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/116615.html