感觉和装饰者模式有点类似
店小二点菜
普通实现
点菜逻辑
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