定义
又称行动模式,交易模式
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销或恢复功能。
角色:
- 命令角色:该角色声明一个给所有具体命令类的抽象接口,定义需要执行的命令
- 具体命令角色:该角色定义一个接收者和行为者之间的弱耦合,实现命令方法,并调用接收者的相应操作
- 调用者:该角色负责调用命令对象执行请求
- 接收者:该角色负责具体实施和执行一个请求
优点:
- 类间解耦
- 可扩展性
- 命令模式结合其他模式会更优秀
缺点:使用命令模式可能会倒是系统出现过多的具体命令类
实例:处理java.awt的事件,变色 和 做动作
package 命令模式;
public interface MyCommand {
public void execute();
}
package 命令模式;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Yellow extends JButton implements MyCommand{
private JPanel p;
public Yellow(String name,JPanel p) {
super(name);
this.p = p;
}
@Override
public void execute() {
// TODO 自动生成的方法存根
p.setBackground(Color.yellow);
}
}
package 命令模式;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Red extends JButton implements MyCommand{
private JPanel p;
public Red(String name,JPanel p) {
super(name);
this.p = p;
}
@Override
public void execute() {
// TODO 自动生成的方法存根
p.setBackground(Color.RED);
}
}
package 命令模式;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Exit extends JButton implements MyCommand{
public Exit(String name) {
super(name);
}
@Override
public void execute() {
// TODO 自动生成的方法存根
System.exit(0);
}
}
package 命令模式;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyFrame extends JFrame implements ActionListener{
private JPanel p;
private Yellow yellow;
private Red red;
private Exit exit;
public MyFrame() {
super("命令模式");
p = new JPanel();
this.add(p);
yellow = new Yellow("黄色", p);
red = new Red("红色", p);
exit = new Exit("退出");
p.add(yellow);
p.add(red);
p.add(exit);
yellow.addActionListener(this);
red.addActionListener(this);
exit.addActionListener(this);
this.setSize(400, 300);
this.setVisible(true);
}
public static void main(String []arg) {
new MyFrame();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
MyCommand myCommand = (MyCommand) e.getSource();
myCommand.execute();
}
}
跑 跳
package 命令模式1;
public interface Command {
public void execute();
}
package 命令模式1;
public interface Action {
public void actions();
}
package 命令模式1;
public class Drop implements Action{
public void actions() {
System.out.println("跳");
}
}
package 命令模式1;
public class Run implements Action{
public void actions() {
System.out.println("跑");
}
}
package 命令模式1;
public class Person implements Command{
private Action action;
public Person(Action action) {
this.action = action;
}
@Override
public void execute() {
// TODO 自动生成的方法存根
this.action.actions();
}
}
package 命令模式1;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Action drAction = new Drop();
Action runAction = new Run();
Command command = new Person(drAction);
command.execute();
command = new Person(runAction);
command.execute();
}
}
跳
跑