美文网首页
第5章 -行为型模式-命令模式

第5章 -行为型模式-命令模式

作者: 一介书生独醉江湖 | 来源:发表于2022-06-23 15:07 被阅读0次
    行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
    
    行为型模式共有11种:
    ■ 模板方法模式
    ■ 命令模式
    ■ 责任链模式
    ■ 策略模式
    ■ 迭代器模式
    ■ 中介者模式
    ■ 观察者模式
    ■ 备忘录模式
    ■ 访问者模式
    ■ 状态模式
    ■ 解释器模式
    
    一、命令模式的简介
    ■ 命令模式(Command Pattern)又称为行动(Action)模式或交易(Transaction)模式;
      将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能;
    
    image.png
    命令模式4个角色:
    ■ 命令(Command)角色:
      该角色声明一个给所有具体命令类的抽象接口,定义需要执行的命令;
    ■ 具体命令(Concrete Command)角色:
      该角色定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相应操作;
    ■ 调用者(Invoker)角色:
      该角色负责调用命令对象执行请求;
    ■ 接收者(Receiver)角色:
      该角色负责具体实施和执行一个请求;
    
    /**
     * 命令接口
     */
    public interface Command {
    
        void execute();
    
    }
    
    /**
     * 具体命令
     */
    public class ConcreteCommand implements Command{
    
        private Receiver receiver;
    
        public ConcreteCommand(Receiver receiver){
            this.receiver = receiver;
        }
    
        /**
         * 执行方法
         */
        @Override
        public void execute() {
            this.receiver.action();
        }
    
    }
    
    /**
     * 调用者
     */
    public class Invoker {
    
        private Command command;
    
        // 接收命令
        public void setCommand(Command command){
            this.command = command;
        }
        // 执行命令
    
        public void action(){
            this.command.execute();
        }
    }
    
    
    /**
     * 接收者
     */
    public class Receiver {
    
        // 执行方法
        public void action(){
            System.out.println("执行动作");
        }
    }
    
    
    /**
     * 应用代码
     */
    public class ClientDemo {
    
        public static void main(String[] args){
    
            // 调用者
            Invoker invoker = new Invoker();
    
            // 接收者
            Receiver receiver = new Receiver();
    
            // 定义一个发送给接收者的命令
            Command command = new ConcreteCommand(receiver);
    
            // 命令
            invoker.setCommand(command);
            invoker.action();
        }
    }
    
    # 控制台输出:
    执行动作
    
    二、命令模式的优缺点
    ■ 命令模式的优点
      类间解耦;调用者角色与接收者角色之间没有任何依赖关系;
      可扩展性;Command 的子类可以非常容易地扩展;
      命令模式结合其他模式会更优秀;
    ■ 命令模式的缺点
      使用命令模式可能会导致系统中出现过多的具体命令类;
    
    三、命令模式的实例
    # Java中的事件处理演示命令模式;
    
    image.png
    /**
     * 抽象命令接口
     */
    public interface MyCommand {
    
        void execute();
    
    }
    
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 黄色按钮控件
     */
    public class YellowCommand extends JButton implements MyCommand{
    
        private JPanel p;
    
        public YellowCommand(String name , JPanel p){
            // 构造一个按钮控件
            super(name);
            this.p = p;
        }
    
        @Override
        public void execute() {
            // 改变面板的背景颜色
            p.setBackground(Color.YELLOW);
        }
    }
    
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 红色按钮控件
     */
    public class RedCommand extends JButton implements MyCommand{
    
        private JPanel p;
    
        public RedCommand(String name , JPanel p){
            // 构造一个按钮控件
            super(name);
            this.p = p;
        }
    
        @Override
        public void execute() {
            // 改变面板的背景颜色
            p.setBackground(Color.RED);
        }
    }
    
    
    import javax.swing.*;
    
    /**
     * 退出系统按钮控件
     */
    public class ExitCommand extends JButton implements MyCommand{
    
        // 构造函数
        public ExitCommand(String name){
            super(name);
        }
    
        @Override
        public void execute() {
            // 系统退出
            System.exit(0);
        }
    }
    
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    /**
     * 图形窗口
     */
    public class MyFrame extends JFrame implements ActionListener {
    
        private JPanel p;
    
        private YellowCommand btnYellow;
    
        private RedCommand btnRed;
    
        private ExitCommand btnExit;
    
        public MyFrame(){
            super("命令模式");
            p = new JPanel();
            this.add(p);
    
            // 实例化具体命令
            btnYellow = new YellowCommand("黄色", p);
            btnRed = new RedCommand("红色", p);
            btnExit = new ExitCommand("退出");
    
            // 将按钮控件添加到面板
            p.add(btnYellow);
            p.add(btnRed);
            p.add(btnExit);
    
            // 添加监听对象
            btnYellow.addActionListener(this);
            btnRed.addActionListener(this);
            btnExit.addActionListener(this);
    
            // 设置窗口
            this.setSize(400 , 300);
            this.setVisible(true);
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            MyCommand my = (MyCommand)e.getSource();
            my.execute();
        }
    
        public static void main(String[] args){
            new MyFrame();
        }
    }
    
    # 结果展示:
    
    image.png
    参考:
    摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
    

    相关文章

      网友评论

          本文标题:第5章 -行为型模式-命令模式

          本文链接:https://www.haomeiwen.com/subject/czpvvrtx.html