JAVA设计模式_模拟小电器(升级优化)

设计目的:

       模拟一个带控制开关的小电器,该电器上有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;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江輕木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值