设计模式之命令模式

首先是命令模式的定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。

命令模式已只能家居为例:

定义好家电类型:

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的功劳  
	}
}

贴一下输出结果:

小米智能家居正在开电脑。。。。。
小米智能家居正在关门。。。。。
小米智能家居正在关灯。。。。。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值