【Java设计模式】· 命令模式(Command Pattern)
2015-08-07 10:14
801 查看
命令模式:
1.命令模式:按自己的理解,命令模式的优点在于封装性完好,user在使用命令模式时候只需要知道“功能”而不需了解其他,而命令模式的重点在于,把所有的命令事先写好在一个类(ControlPanel)中,这样所有的操作都仅对这个(ControlPanel)类执行。ICommand:所有命令的父类
ProjecterOnCommand 等:命令的具体类
Light 等:命令的具体动作
ControlPanel:控制类,控制命令的动作
2.例子:简单地模拟控制一间房间的灯的开关。
首先,创建所有命令(command)的父类IComm
package pers.reus.model.command.impl; public abstract class ICommand { //抽象方法Execute用来执行命令 public abstract void Execute(); }
接下来创建 开灯(LightOnCommand)和关灯(LightOffCommand)两个子类
开灯:
package pers.reus.model.command; import pers.reus.model.command.impl.ICommand; import pers.reus.model.concreteCommand.Light; public class LightOnCommand extends ICommand{ //灯的具体类Light Light light; //声明开灯类时,需要对此类设置一个具体的灯类对象Light public LightOnCommand(Light light){ this.light = light; } //Execute调用灯的具体类里面的"开灯"函数 public void Execute() { light.TurnOnLight(); } }
关灯:
<span style="font-size:12px;">package pers.reus.model.command; import pers.reus.model.command.impl.ICommand; import pers.reus.model.concreteCommand.Light; public class LightOffCommand extends ICommand{ //灯的具体类Light Light light; //声明关灯类时,需要对此类设置一个具体的灯类对象Light public LightOffCommand(Light light){ this.light = light; } //Execute调用灯的具体类里面的"关灯"函数 public void Execute() { light.TurnOffLight(); } }</span>
接下来创建 灯 的具体类:
<span style="font-size:12px;">package pers.reus.model.concreteCommand; //灯 的具体类 public class Light { //开灯 public void TurnOnLight(){ System.out.println("开灯!"); } //关灯 public void TurnOffLight(){ System.out.println("关灯!"); } }</span>
最重要的是这个控制面板(CommandPanel)类:
<span style="font-size:12px;">package pers.reus.model.controlPanel; import java.util.Hashtable; import pers.reus.model.command.impl.ICommand; //CpControlPanel 里面包括一系列的命令操作 public class CpControlPanel { //声明一个Hashtable,用来存放命令代号和命令类 Hashtable ht = new Hashtable(); /** * cmd是命令代号 * ic是命令类 * 如setCommand("lco",LightOnCommand)表示为把"开灯类"存入ht,代号为lco **/ public void setCommand(String cmd,ICommand ic){ ht.put(cmd,ic); } //为每一个功能都创建特定的函数,调用ExcuteLightOn()就会开灯 public void ExcuteLightOn(){ //从ht里面通过代号"lco"找到已经存进去的LightOnCommand类,并赋值给ic ICommand ic = (ICommand) ht.get("lco"); //调用LightOnCommand类的Execute()函数 ic.Execute(); } public void ExcuteLightOff(){ //从ht里面通过代号"lcf"找到已经存进去的LightOffCommand类,并赋值给ic ICommand ic = (ICommand) ht.get("lcf"); //调用LightOnCommand类的Execute()函数 ic.Execute(); } }</span>
客户类进行测试:
package pers.reus.model.client; import pers.reus.model.command.LightOffCommand; import pers.reus.model.command.LightOnCommand; import pers.reus.model.concreteCommand.Light; import pers.reus.model.controlPanel.CpControlPanel; //客户类测试 public class CommandPatternClient { public static void main(String[] args) { //声明灯的具体类 Light light = new Light(); //在开灯和关灯类中放入灯的具体对象 LightOnCommand lco = new LightOnCommand(light); LightOffCommand lcf = new LightOffCommand(light); //声明控制面板类 CpControlPanel ccp = new CpControlPanel(); //把开灯,关灯的ICommand类放入hashtable并设定对应的代号 ccp.setCommand("lco",lco); ccp.setCommand("lcf",lcf); //调用控制面板类(CpContrilPanel)里面的开灯函数,进行测试 ccp.ExcuteLightOn(); } }
相关文章推荐
- 用myeclipse创建webservice
- java 字节流与字符流的区别
- java web用于保持状态的4种方法
- Java内部类以及匿名内部类学习总结
- Java多线程——<五>后台线程(daemon)
- 数据库表转javaBean
- java中Collections.sort排序详解
- Eclipse安装Freemarker Editor插件
- Java中的值传递和引用传递
- 高效率的文件复制的Java代码
- java分页实现
- Java学习笔记四——接口与内部类
- 初级问题 --eclipse中代码自动更新的解决办法
- 关于Java的File.separator
- Eclipse添加小工具_打开当前文件所在文件夹
- JAVA实现全角半角相互转化 (full2Half & half2Full)
- abstract class和interface的区别
- Spring事务配置的五种方式
- 如何建立一个maven工程导入myeclipse
- 用Robocod游戏来学习JAVA