设计目的:
模拟一个带控制开关的小电器,该电器上有4个开关,2个一组,其中一组负责打开/关闭小电器上的照明灯,另一组负责打开/关闭小电器上的摄像头。
设计要求:
1)设计Camera类(模拟摄像头)和Light类(模拟照明灯)。
2)设计Machine类(模拟小电器)。
3)要求Machine类创建的对象中含有打开、关闭摄像头以及打开、关闭照明灯的按钮。
4)为客户提供友好的界面,当用户单击小电器上的按钮时,界面能呈现摄像头或照明灯的状态。
设计类图:
设计实现:
1、接收者
Camera类和Light类的实例是命令模式中的接收者。Camera类和Light类的代码如下:
Camera.java
package EXP01_MACHINE;
public class Camera {
public void on(){
System.out.println("打开摄像头");
}
public void off(){
System.out.println("关闭摄像头");
}
}
Light.java
package EXP01_MACHINE;
public class Light {
public void on(){
System.out.println("打开灯");
}
public void off(){
System.out.println("关闭灯");
}
}
2、命令接口包括execute()方法。
Command.java
package EXP01_MACHINE;
public interface Command {
public void execute();
}
3、具体命令
共有OnCameraCommand,OffCameraCommand,OnLightCommand和OffLightCommand四个具体命令类,代码如下:
OnCameraCommand.java
package EXP01_MACHINE;
public class OnCameraCommand implements Command{
public Camera camera;
public OnCameraCommand(Camera camera) {
this.camera=camera;
}
@Override
public void execute(){
camera.on();
}
}
OffCameraCommand.java
package EXP01_MACHINE;
public class OffCameraCommand implements Command{
public Camera camera;
public OffCameraCommand(Camera camera) {
this.camera=camera;
}
@Override
public void execute(){
camera.off();
}
}
OnLightCommand.java
package EXP01_MACHINE;
public class OnLightCommand implements Command{
public Light light;
public OnLightCommand(Light light) {
this.light=light;
}
@Override
public void execute(){
light.on();
}
}
OffLightCommand.java
package EXP01_MACHINE;
public class OffLightCommand implements Command{
public Light light;
public OffLightCommand(Light light) {
this.light=light;
}
@Override
public void execute() {
light.off();
}
}
4、请求者
Invoke类的实例含有程序所需要的按钮(命令)。
Invoker.java
package EXP01_MACHINE;
public class Invoker {
public Command command;
public void setCommand(Command command){
this.command=command;
}
public void executeCommand(){
command.execute();
}
}
5、小电器的实现
Machine.java
package EXP01_MACHINE;
import java.util.Scanner;
public class Machine {
public static void main(String[]args){
System.out.println("打开灯:Turn on the lights\n关闭灯:Turn off the lights\n打开摄像头:Turn on the camera\n关闭摄像头:Turn off the camera\n输入End关闭遥控");
System.out.print("请输入命令:");
Scanner input=new Scanner(System.in);
String command=input.nextLine();
while(true){
if(command.equalsIgnoreCase("Turn on the lights")){
//打开灯
Light light=new Light();
Command command1=new OnLightCommand(light);//命令里面有light方法
//创建请求者
Invoker invoker=new Invoker();
//请求者发出命令
invoker.setCommand(command1);//传过command命令
invoker.executeCommand();//执行命令里的方法
} else if(command.equalsIgnoreCase("Turn off the lights")){
//打开摄像头
Light light=new Light();
Command command1=new OffLightCommand(light);//命令里面有light方法
//创建请求者
Invoker invoker=new Invoker();
//请求者发出命令
invoker.setCommand(command1);//传过command命令
invoker.executeCommand();//执行命令里的方法
}else if(command.equalsIgnoreCase("Turn on the camera")){
//打开摄像头
Camera camera=new Camera();
Command command2=new OnCameraCommand(camera);//命令里面有light方法
//创建请求者
Invoker invoker=new Invoker();
//请求者发出命令
invoker.setCommand(command2);//传过command命令
invoker.executeCommand();//执行命令里的方法
}else if(command.equalsIgnoreCase("Turn off the camera")){
//打开摄像头
Camera camera=new Camera();
Command command2=new OffCameraCommand(camera);//命令里面有Camera方法
//创建请求者
Invoker invoker=new Invoker();
//请求者发出命令
invoker.setCommand(command2);//传过command命令
invoker.executeCommand();//执行命令里的方法
}else if(command.equalsIgnoreCase("End")) {
System.out.println("欢迎下次使用");
break;
}
else{
System.out.println("命令输入错误,请重新输入");
System.out.print("请输入命令:");
Scanner input2=new Scanner(System.in);
command=input2.nextLine();
continue;
}
break;
}
}
}