首先是命令模式的定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
命令模式已只能家居为例:
定义好家电类型:
package 命令模式;
public class Lights {
public void Open() {
System.out.println("小米智能家居正在开灯。。。。。");
}
public void Close() {
System.out.println("小米智能家居正在关灯。。。。。");
}
}
package 命令模式;
public class Computer {
public void Open() {
System.out.println("小米智能家居正在开电脑。。。。。");
}
public void Close() {
System.out.println("小米智能家居正在关电脑。。。。。");
}
}
package 命令模式;
public class Door {
public void Open() {
System.out.println("小米智能家居正在开门。。。。。");
}
public void Close() {
System.out.println("小米智能家居正在关门。。。。。");
}
}
目前就列这是三个家居吧,够用就行。
然后是编写命令类:
package 命令模式;
/**
* 被封装的命令类
* @author Administrator
*
*/
public interface Command {
public void execute();
}
package 命令模式;
public class ComputerCloseCommand implements Command {
private Computer computer;
public ComputerCloseCommand(Computer computer) {
this.computer=computer;
}
@Override
public void execute() {
// TODO Auto-generated method stub
this.computer.Close();
}
}
package 命令模式;
public class ComputerOnCommand implements Command {
private Computer computer;
public ComputerOnCommand(Computer computer) {
this.computer=computer;
}
@Override
public void execute() {
// TODO Auto-generated method stub
this.computer.Open();
}
}
package 命令模式;
public class DoorCloseCommand implements Command {
private Door door;
public DoorCloseCommand(Door door) {
this.door=door;
}
@Override
public void execute() {
// TODO Auto-generated method stub
this.door.Close();
}
}
package 命令模式;
public class DoorOnCommand implements Command {
private Door door;
public DoorOnCommand(Door door) {
this.door=door;
}
@Override
public void execute() {
// TODO Auto-generated method stub
this.door.Open();
}
}
package 命令模式;
/**
* 关掉的命令
* @author Administrator
*
*/
public class LightoffCommand implements Command {
private Lights light;
public LightoffCommand(Lights light) {
this.light=light;
}
@Override
public void execute() {
// TODO Auto-generated method stub
light.Close();
}
}
package 命令模式;
public class LightOnCommand implements Command{
private Lights light;
public LightOnCommand(Lights light) {
this.light=light;
}
@Override
public void execute() {
// TODO Auto-generated method stub
this.light.Open();
}
}
接下来就是遥控器了~
package 命令模式;
public class ControlPanel {
private static final int CONTROL_SIZE = 9;
private Command[] commands;
/**
* 初始化所有按钮指向空对象
*/
public ControlPanel() {
commands = new Command[CONTROL_SIZE]; //将数组定义9位数的打小
for(int i=0;i<CONTROL_SIZE;i++)
{
commands[i]=new NoCommand();
}
}
/**
* 設置每個按鈕的命令
* @param index
* @param command
*/
public void setCommand(int index,Command command)
{
commands[index] = command;
}
public void click(int index) {
commands[index].execute();
}
}
package 命令模式;
/**
* 空对象,有了空对象,我们就不用执行前都判断if(!=null),并且提供了一致的操作
* @author Administrator
*
*/
public class NoCommand implements Command {
@Override
public void execute() {
// TODO Auto-generated method stub
}
}
最后是测试类
package 命令模式;
public class test {
public static void main(String[] args) {
/**
* 三个家电
*/
Lights light = new Lights();
Door door = new Door();
Computer computer = new Computer();
/**
* 一个控制器,假设是我们的app主界面
*/
ControlPanel controlPanel = new ControlPanel();
// 为每个按钮设置功能
controlPanel.setCommand(0, new LightOnCommand(light)); //0开灯,1关灯,2开电脑,3关电脑,4开门,5关门
controlPanel.setCommand(1, new LightoffCommand(light));
controlPanel.setCommand(2, new ComputerOnCommand(computer));
controlPanel.setCommand(3, new ComputerCloseCommand(computer));
controlPanel.setCommand(4, new DoorOnCommand(door));
controlPanel.setCommand(5, new DoorCloseCommand(door));
// 模拟点击
controlPanel.click(2);
controlPanel.click(5);
controlPanel.click(1);
controlPanel.click(6);
controlPanel.click(7);
controlPanel.click(8);// 这个没有指定,但是不会出任何问题,我们的NoCommand的功劳
}
}
贴一下输出结果:
小米智能家居正在开电脑。。。。。
小米智能家居正在关门。。。。。
小米智能家居正在关灯。。。。。