命令模式是一个对象请求另一个对象调用其方法达到某一目的
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(); }
命令模式的应用。