设计模式学习----命令模式

[b][color=blue]GOF的定义:
命令模式(别名:动作,事物)
将一个请求封装成一个对象,从而使用户可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作.[/color][/b]

[img]http://dl.iteye.com/upload/attachment/225108/77f18335-c3f4-38f5-b4c6-8fa3a871da0c.bmp[/img]


[color=blue]
在许多设计中, 经常涉及到一个对象请求另一个对象调用其方法达到某种目的. 如果请求者不希望或无法直接和被请求者打交到, 即不希望或无法含有被请求者的引用,那么就可以使用命令模式.

提出请求的对象为请求者, 被请求的对象为接收者. 在命令模式中, 当一个对象请求另一个对象调用其方法时, 不和被请求的对象直接打交道, 而是把这种"请求"封装到一个称作"命令"的对象中, 其封装手段是将"请求"封装在"命令"对象的一个方法中.

命令模式的核心就是使用命令对象来封装方法调用, 即将请求者的请求, 接收者调用方法封装到命令对象的一个方法中, 这样, 当一个对象请求另一个对象调用方法来完成某项任务时,只需和命令对象打交道, 即让命令对象调用封装了"请求"的那个方法即可.


[b]命令模式的优点:[/b]

1. 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合.

2. 命令模式满足"开-闭"原则. 如果增加新的具体命令和该命令的接收者, 不必修改调用者的代码, 调用者就可以使用新的命令对象; 反之, 如果增加新的调用者, 不必修改现有的具体命令和接收者, 新增加的调用者就可以使用自己已有的具体命令

3.由于请求者被封装到了具体命令中, 那么就可以将具体命令保存到持久化的媒介中, 在需要的时候, 重新执行这个具体命令. 因此使用命令模式可以记录日志.

4.使用命令模式可以对请求者的"请求"进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令.
[/color]



package CommandPattern;
import javax.swing.*;
public class Camera extends JPanel{
String name;
Icon imageIcon;
JLabel label;
public Camera(){
label=new JLabel("我是摄像头");
add(label);
}
public void on(){
label.setIcon(new ImageIcon("cameraOpen.jpg"));
}
public void off(){
label.setIcon(new ImageIcon("cameraOff.jpg"));
}
}




package CommandPattern;
import javax.swing.*;
public class Light extends JPanel{
String name;
Icon imageIcon;
JLabel label;
public Light(){
label=new JLabel("我是照明灯");
add(label);
}
public void on(){
label.setIcon(new ImageIcon("lightOpen.jpg"));
}
public void off(){
label.setIcon(new ImageIcon("lightOff.jpg"));
}
}





package CommandPattern;

public class OnCameraCommand implements Command{
Camera camera;
OnCameraCommand(Camera camera){
this.camera=camera;
}
public void execute(){
camera.on();
}
public String getName(){
return "打开摄像头!";
}
}





package CommandPattern;

public class OffCameraCommand implements Command{
Camera camera;
OffCameraCommand(Camera camera){
this.camera=camera;
}
public void execute(){
camera.off();
}
public String getName(){
return "关闭摄像头!";
}
}





package CommandPattern;

public class OnLightCommand implements Command{
Light light;
OnLightCommand(Light light){
this.light=light;
}
public void execute(){
light.on();
}
public String getName(){
return "打开 照明灯!";
}
}





package CommandPattern;

public class OffLightCommand implements Command{
Light light;
OffLightCommand(Light light){
this.light=light;
}
public void execute(){
light.off();
}
public String getName(){
return "关闭 照明灯!";
}
}





package CommandPattern;

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




package CommandPattern;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Invoke {
JButton button;
Command command;
Invoke(){
button=new JButton();
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
executeCommand();
}
});
}
public void setCommand(Command command){
this.command=command;
button.setText(command.getName());
}
public JButton getButton(){
return button;
}
private void executeCommand(){
command.execute();
}
}





package CommandPattern;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Machine extends JFrame{
Invoke requestOnCamera,requestOffCamera,requestOnLight,requestOffLight;
Camera camera; Light light;
Machine(){
setTitle("小电器");
requestOnCamera=new Invoke();
requestOffCamera=new Invoke();
camera=new Camera();
light=new Light();
requestOnCamera.setCommand(new OnCameraCommand(camera));
requestOffCamera.setCommand(new OffCameraCommand(camera));
requestOnLight=new Invoke();
requestOffLight=new Invoke();
requestOnLight.setCommand(new OnLightCommand(light));
requestOffLight.setCommand(new OffLightCommand(light));
initPosition();
setSize(200,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void initPosition(){
JPanel pSourth=new JPanel();
pSourth.add(requestOnCamera.getButton());
pSourth.add(requestOffCamera.getButton());
pSourth.add(requestOnLight.getButton());
pSourth.add(requestOffLight.getButton());
add(pSourth,BorderLayout.SOUTH);
JPanel pNorth=new JPanel();
pNorth.add(light);
add(pNorth,BorderLayout.NORTH);
JPanel pCenter=new JPanel();
pCenter.setBackground(Color.yellow);
pCenter.add(camera);
add(pCenter,BorderLayout.CENTER);
}
public static void main(String agrs[]){
Machine macine=new Machine();
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值