深圳市建设科技促进中心网站,泰兴网站优化,相城seo网站优化软件,营销网络写在前面
本文看下命令设计模式。
1#xff1a;介绍
1.1#xff1a;什么时候使用命令设计模式
如果某个对象依赖于外部传入的具体参数来执行具体的操作时#xff0c;就可以考虑使用命令设计模式#xff0c;如空调的制冷#xff0c;制热#xff0c;小爱同学的唱歌介绍
1.1什么时候使用命令设计模式
如果某个对象依赖于外部传入的具体参数来执行具体的操作时就可以考虑使用命令设计模式如空调的制冷制热小爱同学的唱歌讲笑话等都是通过外部的具体指令发生的操作。
1.2UML类图
原型设计模式包含如下元素
1Receiver负责执行具体指令的类即能够执行特定操作的类
2Command命令抽象内部维护Receiver通过Recevier让命令最终变成具体的动作
3Invoker维护一组Command并执行这组指令
4客户端负责创建Invoker并设置相关需要执行的指令2实例
源码 。
2.1场景
小明家里有一台空调可以控制其制冷和制热有一个小爱同学可以控制其唱歌和讲笑话。
2.2程序
定义空调Receiver
// 空调
public class AirConditionerReceiver {// 制冷public void cold() {System.out.println(空调制冷了);}// 制热public void hot() {System.out.println(空调制热了);}
}定义小爱同学Receiver
// 小爱同学
public class XiaoAiTongXueReceiver {// 唱歌public void sing() {System.out.println(小爱同学唱歌了);}// 讲笑话public void joke() {System.out.println(小爱同学讲笑话了);}
}接着我们来定义用来执行空调制冷空调制热小爱同学唱歌小爱同学讲笑话的Command类首先定义接口
// 命令的抽象,
public interface Command {void exec();
}各种执行具体动作的Command 一共四个分别是执行空调制冷的Command空调制热的Command小爱同学唱歌的Command小爱同学讲笑话的Command如下
// 制冷命令内部调用空调的制冷操作
public class ColdCommand implements Command {private AirConditionerReceiver receiver;public ColdCommand(AirConditionerReceiver receiver) {this.receiver receiver;}Overridepublic void exec() {this.receiver.cold();}
}// 制热命令内部调用空调的制热操作
public class HotCommand implements Command {private AirConditionerReceiver receiver;public HotCommand(AirConditionerReceiver receiver) {this.receiver receiver;}Overridepublic void exec() {this.receiver.hot();}
}// 唱歌命令内部调用小爱同学的唱歌
public class SingCommand implements Command {private XiaoAiTongXueReceiver xiaoAiTongXue;public SingCommand(XiaoAiTongXueReceiver xiaoAiTongXue) {this.xiaoAiTongXue xiaoAiTongXue;}Overridepublic void exec() {this.xiaoAiTongXue.sing();}
}// 讲笑话命令内部调用小爱同学的讲笑话
public class JokeCommand implements Command {private XiaoAiTongXueReceiver xiaoAiTongXue;public JokeCommand(XiaoAiTongXueReceiver xiaoAiTongXue) {this.xiaoAiTongXue xiaoAiTongXue;}Overridepublic void exec() {this.xiaoAiTongXue.joke();}
}定义Invoker 维护一组要执行的Command其中Command的设置由客户端完成
public class MyInvoker {// 自己用仅本类用private// 不可改变引用值 finalprivate final ListCommand commands new ArrayListCommand();// 设置一组命令由命令来完成具体的动作内部操作是如何完成的对用户是透明的public void addCommand(Command command) {this.commands.add(command);}// 执行命令public void execCommand() {commands.forEach(v - v.exec());}
}客户端
public static void main(String[] args) {// 创建具体命令的执行者们AirConditionerReceiver airConditionerReceiver new AirConditionerReceiver();XiaoAiTongXueReceiver xiaoAiTongXueReceiver new XiaoAiTongXueReceiver();// 创建命令Command singCommand new SingCommand(xiaoAiTongXueReceiver);Command jokeCommand new JokeCommand(xiaoAiTongXueReceiver);Command coldCommand new ColdCommand(airConditionerReceiver);Command hotCommand new HotCommand(airConditionerReceiver);// 把命令添加到invokerMyInvoker myInvoker new MyInvoker();myInvoker.addCommand(singCommand);myInvoker.addCommand(jokeCommand);myInvoker.addCommand(hotCommand);myInvoker.addCommand(coldCommand);// 执行命令myInvoker.execCommand();
}运行
小爱同学唱歌了
小爱同学讲笑话了
空调制热了
空调制冷了写在后面
参考文章列表
秒懂设计模式之命令模式Command Pattern 。