在软件开发中,由于请求者与行为实现者之间存在过高的耦合,这样对于同一个接口存在多处调用的情况下,我们对其进行封装,这样供各处调用,而且大大的降低了请求者与行为执行者之间的耦合度。在实际运用中,例如在客户端发起的请求,可以通过不同的Cmd的命令字来调取相应的接口实现类,完成逻辑,而且这种设计模式已经广泛的运用。
于是乎,命令模式成为了设计模式中的十分重要一部分,而且在开发中也是运用十分流行。
概念的不多说了,具体的代码实现如下,你也秒懂命令模式,并喜欢上这种模式;
代码背景:采用了小明考试作弊体验命令模式
1.定义小明的行为动作
package com.test.command; /** * commond 命令行为 * * @author yuewen * */ public interface XiaoMingCommand { // 拿出考试作弊科目资料 public void execute(); }
2.定义小明考试的所有小抄
package com.test.command; /** * 小明口袋里的作弊小抄(这里在实际项目中可以类比成XXXManager)譬如订单模块:public OrderManager{//包含了订单模块的所有处理接口} * * @author yuewen * */ public class XiaoMingAnswerStore { /** * 执行看语文小抄 */ public void chinese() { System.out.println("此刻我需要拿出语文的小抄"); } /** * 执行看数学小抄 */ public void math() { System.out.println("此刻我需要拿出数学的小抄"); } /** * 执行看英语小抄 */ public void english() { System.out.println("此刻我需要拿出英语的小抄"); } }
3.定义小明查看语文的小抄
package com.test.command; /** * 小明查看语文的小抄(打比方:这里在实际项目中可以类比成某一个顶订单模块的接口逻辑之一) * * @author yuewen * */ public class LookChineseAnswer implements XiaoMingCommand { private XiaoMingAnswerStore xiaoMingAnswerStore; public LookChineseAnswer(XiaoMingAnswerStore xiaoMingAnswerStore) { this.xiaoMingAnswerStore = xiaoMingAnswerStore; } @Override public void execute() { // 看语文小抄 xiaoMingAnswerStore.chinese(); } }
4.定义小明查看数学的小抄
package com.test.command; /** * 小明查看数学的小抄(打比方:这里在实际项目中可以类比成某一个顶订单模块的接口逻辑之一) * * @author yuewen * */ public class LookMathAnswer implements XiaoMingCommand { private XiaoMingAnswerStore xiaoMingAnswerStore; public LookMathAnswer(XiaoMingAnswerStore xiaoMingAnswerStore) { this.xiaoMingAnswerStore = xiaoMingAnswerStore; } @Override public void execute() { // 小明查看数学的小抄 xiaoMingAnswerStore.math(); } }
5.定义小明查看英语的小抄
package com.test.command; /** * 小明查看英语的小抄(打比方:这里在实际项目中可以类比成某一个顶订单模块的接口逻辑之一) * * @author yuewen */ public class LookEnglishAnswer implements XiaoMingCommand { private XiaoMingAnswerStore xiaoMingAnswerStore; public LookEnglishAnswer(XiaoMingAnswerStore xiaoMingAnswerStore) { this.xiaoMingAnswerStore = xiaoMingAnswerStore; } @Override public void execute() { // 小明拿出英语的小抄 xiaoMingAnswerStore.english(); } }
6.定义小明的需要的考试
package com.test.command; /** * 由于小明不知道这场考试考什么,所有预先准备了三科目的小抄 * * @author yuewen * */ public class UnKnowExam { // 准备语文的小抄 private LookChineseAnswer lookChineseAnswer; // 准备数学的小抄 private LookMathAnswer lookMathAnswer; // 准备英语的小抄 private LookEnglishAnswer lookEnglishAnswer; public UnKnowExam(LookChineseAnswer lookChineseAnswer, LookMathAnswer lookMathAnswer, LookEnglishAnswer lookEnglishAnswer) { this.lookChineseAnswer = lookChineseAnswer; this.lookMathAnswer = lookMathAnswer; this.lookEnglishAnswer = lookEnglishAnswer; } // 语文考试的话 public void chineseExam() { lookChineseAnswer.execute(); } // 数学考试的话 public void mathExam() { lookMathAnswer.execute(); } // 英语考试的话 public void englistExam() { lookEnglishAnswer.execute(); } }
7.测试类,小明的实际考试
package com.test.command; /** * 小明的一天的考试 * * @author yuewen * */ public class XiaoMingExam { public static void main(String[] args) throws InterruptedException { // 小明口袋里今天准备作弊的全部小抄 XiaoMingAnswerStore answer = new XiaoMingAnswerStore(); // 语文小抄 LookChineseAnswer chineseAnswer = new LookChineseAnswer(answer); // 数学小抄 LookMathAnswer mathAnswer = new LookMathAnswer(answer); // 英语小抄 LookEnglishAnswer englishAnswer = new LookEnglishAnswer(answer); // 一天的考试:语文,数学,英语 UnKnowExam exam = new UnKnowExam(chineseAnswer, mathAnswer, englishAnswer); // 早上先考语文,于是没复习的小明拿出语文的小抄 exam.chineseExam(); // 考完语文,休息准备英语 Thread.sleep(30); // 到了考英语,于是没复习的小明拿出英语的小抄 exam.englistExam(); // 考完英语,明天考数学 Thread.sleep(60); // 到了考数学,于是没复习的小明拿出数学的小抄 exam.mathExam(); } }
结果:
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-09-13 01:03:43