重读设计模式---命令模式

命令模式是一个对象请求另一个对象调用其方法达到某一目的

java源码中对 命令模式的应用是监听事件,例如:

jButton=new JButton();
jButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        executeCommand();
    }
});
button 是请求者, Listener接口是抽象命令, actionListener是具体的命令,里面是执行者。

命令模式的应用 ---智能电器遥控器

public class TV extends JPanel{
    private JLabel jLabel;
    Camera(){
        jLabel=new JLabel("dians");
        jLabel.setIcon(new ImageIcon("cameraOff.jpg"));
        add(jLabel);
    }
    public void on(){
        jLabel.setIcon(new ImageIcon("cameraOn.jpg"));
        System.out.println("打开电视机");
    }
    public void off(){
        jLabel.setIcon(new ImageIcon("cameraOff.jpg"));
        System.out.println("关闭电视机");
    }
}

有一个遥控器,上面有4个按钮,分别控制 台灯的开关,和 电视机的开关。

1、设计TV类和Light类

2、设计遥控器 Machine类

3、要求Machine类中有 打开关闭 台灯和电视机的按钮。

4、为用户提供友好界面,用户点击小电器上的按钮时,界面能呈现 台灯或者 电视机的状态。

public class Light extends JPanel{
    private JLabel jLabel;
//    private Icon imageIcon;
//    private String name;

    public Light(){
        jLabel=new JLabel("灯泡");
        Icon icon=new ImageIcon("lightOff.jpg");
        jLabel.setIcon(icon);
        add(jLabel);
    }
//    private String name;
    public void on(){
        System.out.println("开灯");
        Icon icon=new ImageIcon("lightOn.jpg");
        jLabel.setIcon(icon);
    }
    public void off(){
        System.out.println("关灯");
        Icon icon=new ImageIcon("lightOff.jpg");
        jLabel.setIcon(icon);
    }
}

// 台灯与电视机都是接收者。

然后建抽象命令类

public interface Command {
    public String getName();
    public void execute();
}

命令分为 名称与操作

public class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light){
        this.light=light;
    }
    @Override
    public String getName() {
        return "关灯";
    }

    @Override
    public void execute() {
        light.off();
    }
}
关灯的类

public class LightOnCommand implements Command {
    public Light light;

    public LightOnCommand(Light light){
        this.light=light;
    }
    @Override
    public String getName() {
        return "开灯";
    }

    @Override
    public void execute() {
        light.on();
    }
}
关闭电视机

public class TVOffCommand implements Command {
    private TV tv;

    public TVOffCommand(Camera camera){
        this.camera=camera;
    }
    @Override
    public String getName() {
        tv.setName("关闭电视机");
        return "关闭电视机";
    }

    @Override
    public void execute() {
        tv.off();
    }
}
打开电视机
public class TVOnCommand implements Command {
    private TV tv;
    public TvOnCommand(Camera camera){
        this.tv=tv;
    }
    @Override
    public String getName() {
        tv.setName("打开电视机");
        return "打开电视机";
    }

    @Override
    public void execute() {
        tv.on();
    }
}

将控制按钮与命令结合
public class Invoke {
    private JButton jButton;
    private Command command;
    public Invoke(){
        jButton=new JButton();
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                executeCommand();
            }
        });
    }

    public void setCommand(Command command){
        this.command=command;
        jButton.setText(command.getName());
    }
    public void executeCommand(){
        command.execute();
    }
    public JButton getjButton(){
        return jButton;
    }
}
展示出来
public class Machine extends JFrame {
    private TV tv;
    private Light light;
    private Invoke lightOn, lightOff, TvOn, TvOff;

    public Machine() {
        setTitle("小电器");
        tv= new Tv();
        light = new Light();
        lightOn = new Invoke();
        lightOff = new Invoke();
        CameraOn = new Invoke();
        CameraOff = new Invoke();

        lightOn.setCommand(new LightOnCommand(light));
        lightOff.setCommand(new LightOffCommand(light));

        TVOn.setCommand(new TvOnCommand(tv));
        TVOff.setCommand(new TvOffCommand(tv));
        initPosition();
        this.setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 600);
    }

    private void initPosition() {
        JPanel jPanel = new JPanel();
        jPanel.add(lightOn.getjButton());
        jPanel.add(lightOff.getjButton());
        jPanel.add(CameraOn.getjButton());
        jPanel.add(CameraOff.getjButton());
        add(jPanel, BorderLayout.SOUTH);

        JPanel lightPanel = new JPanel();
        lightPanel.add(light);
        JPanel CameraPanel = new JPanel();
        CameraPanel.add(camera);
        add(lightPanel, BorderLayout.NORTH);
        add(CameraPanel, BorderLayout.CENTER);

    }

    public static void main(String[] args) {
        Machine machine = new Machine();
    }
命令模式的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大巨魔战将

如果对您有帮助,请打赏1分钱

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

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

打赏作者

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

抵扣说明:

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

余额充值