行为型模式-命令模式

感觉和装饰者模式有点类似
店小二点菜

普通实现

点菜逻辑

public class XiaoEr {
    private Logger logger = LoggerFactory.getLogger(XiaoEr.class);
    private Map<Integer, String> cuisineMap = new ConcurrentHashMap<>();

    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));
    }
}

ApiTest

@Test
public void test(){
    XiaoEr xiaoEr = new XiaoEr();
    xiaoEr.order(1);
    xiaoEr.order(2);
    xiaoEr.order(3);
    xiaoEr.order(4);
    xiaoEr.placeOrder();
}

命令模式重构

抽象出菜系接口ICuisine、烹饪接口ICook。
ICuisine接口实现类引入ICook类型属性,ICook类型属性调用ICook接口实现类方法。
在这里插入图片描述
ICuisine接口

public interface ICuisine {
    void cook();
}

ICuisine接口实现类

public class GuangDongCuisine implements ICuisine {
    private ICook iCook;

    public GuangDongCuisine(ICook iCook) {
        this.iCook = iCook;
    }

    @Override
    public void cook() {
        iCook.doCooking();
    }
}

ICook接口

public interface ICook {
    void doCooking();
}

ICook接口实现类

public class GuangDongCook implements ICook {
    private Logger logger = LoggerFactory.getLogger(ICook.class);
    @Override
    public void doCooking() {
        logger.info("广东厨师,烹饪鲁菜,宫廷菜系,以孔府风味为龙头");
    }
}

小二类

public class XiaoEr {
    private List<ICuisine> cuisineList = new ArrayList<>();
    
    public void order(ICuisine iCuisine) {
        cuisineList.add(iCuisine);
    }

    public synchronized void placeOrder() {
        for (ICuisine iCuisine : cuisineList) {
            iCuisine.cook();
        }
        cuisineList.clear();
    }
}

ApiTest

public class ApiTest {
    @Test
    public void test() {
        ICuisine guangDongCuisine = new GuangDongCuisine(new GuangDongCook());
        ICuisine jiangSuCuisine = new JiangSuCuisine(new JiangSuCook());
        ICuisine shanDongCuisine = new ShanDongCuisine(new ShanDongCook());
        ICuisine siChuanCuisine = new SiChuanCuisine(new SiChuanCook());

        XiaoEr xiaoEr = new XiaoEr();
        xiaoEr.order(guangDongCuisine);
        xiaoEr.order(jiangSuCuisine);
        xiaoEr.order(shanDongCuisine);
        xiaoEr.order(siChuanCuisine);

        xiaoEr.placeOrder();
    }
}

效果

D:\Java\jdk-8.401\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IntelliJ IDEA Community Edition 2021.3.3\lib\idea_rt.jar=64602:D:\IntelliJ IDEA Community Edition 2021.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\IntelliJ IDEA Community Edition 2021.3.3\lib\idea_rt.jar;D:\IntelliJ IDEA Community Edition 2021.3.3\plugins\junit\lib\junit5-rt.jar;D:\IntelliJ IDEA Community Edition 2021.3.3\plugins\junit\lib\junit-rt.jar;D:\Java\jdk-8.401\jre\lib\charsets.jar;D:\Java\jdk-8.401\jre\lib\deploy.jar;D:\Java\jdk-8.401\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk-8.401\jre\lib\ext\cldrdata.jar;D:\Java\jdk-8.401\jre\lib\ext\dnsns.jar;D:\Java\jdk-8.401\jre\lib\ext\jaccess.jar;D:\Java\jdk-8.401\jre\lib\ext\jfxrt.jar;D:\Java\jdk-8.401\jre\lib\ext\localedata.jar;D:\Java\jdk-8.401\jre\lib\ext\nashorn.jar;D:\Java\jdk-8.401\jre\lib\ext\sunec.jar;D:\Java\jdk-8.401\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk-8.401\jre\lib\ext\sunmscapi.jar;D:\Java\jdk-8.401\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk-8.401\jre\lib\ext\zipfs.jar;D:\Java\jdk-8.401\jre\lib\javaws.jar;D:\Java\jdk-8.401\jre\lib\jce.jar;D:\Java\jdk-8.401\jre\lib\jfr.jar;D:\Java\jdk-8.401\jre\lib\jfxswt.jar;D:\Java\jdk-8.401\jre\lib\jsse.jar;D:\Java\jdk-8.401\jre\lib\management-agent.jar;D:\Java\jdk-8.401\jre\lib\plugin.jar;D:\Java\jdk-8.401\jre\lib\resources.jar;D:\Java\jdk-8.401\jre\lib\rt.jar;D:\code\设计模式\command-02\target\test-classes;D:\code\设计模式\command-02\target\classes;D:\repo\junit\junit\4.12\junit-4.12.jar;D:\repo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\repo\com\alibaba\fastjson\1.2.62\fastjson-1.2.62.jar;D:\repo\org\slf4j\slf4j-api\1.7.5\slf4j-api-1.7.5.jar;D:\repo\org\slf4j\jcl-over-slf4j\1.7.5\jcl-over-slf4j-1.7.5.jar;D:\repo\ch\qos\logback\logback-classic\1.0.9\logback-classic-1.0.9.jar;D:\repo\ch\qos\logback\logback-core\1.0.9\logback-core-1.0.9.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.leilei.command.test.ApiTest,test
22:25:14.057 [main] INFO  cn.leilei.command.cook.ICook - 广东厨师,烹饪鲁菜,宫廷菜系,以孔府风味为龙头
22:25:14.061 [main] INFO  cn.leilei.command.cook.ICook - 江苏厨师,烹饪苏菜,宫廷菜系,古今国宴上最受人欢迎的菜系。
22:25:14.061 [main] INFO  cn.leilei.command.cook.ICook - 山东厨师,烹饪鲁菜,宫廷菜系,以孔府风味为龙头
22:25:14.062 [main] INFO  cn.leilei.command.cook.ICook - 四川厨师,烹饪川菜,中国最有特色的菜系,也是民间喜欢的菜系。

Process finished with exit code 0
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值