zoukankan      html  css  js  c++  java
  • 2命令模式

    命令模式

    命令模式(Command Pattern)又称为行动(Action)模式或交易(Transaction)模式。

    1命令模式的定义
    命令模式的原文是:
    Encapsulate a request as an object, thereby letting you parameterize clients with different request,queue or log requests,and support undoable operations.
    翻译过来就是:
    将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。

    命令模式有如下4个角色:
    • 命令角色(Command)角色:该角色声明一个给所有具体命令类的抽象接口,定义需要执行的命令。
    • 具体命令(Concrete Command)角色:该角色定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相应操作。
    • 调用者(Invoker)角色:该角色负责调用命令对象执行请求。
    • 接收者(Receiver)角色:该角色负责调用具体实施和执行一个请求。

    命令模式类图
    创建Command接口
    Command.java
    package com.eric.行为型模式.命令模式.command;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 命令接口
     * @CreateTime 2020-12-07 08:38:51
     */
    public interface Command {
        //执行命令的方法
        public void execute();
    }
    创建Command的实现类
    ConcreteCommand.java
    package com.eric.行为型模式.命令模式.command;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 命令接口
     * @CreateTime 2020-12-07 08:38:51
     */
    public interface Command {
        //执行命令的方法
        public void execute();
    }
    创建接收者
    Receiver.java
    package com.eric.行为型模式.命令模式.role;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 行动方法
     * @CreateTime 2020-12-07 08:40:19
     */
    public class Receiver {
        //行动方法
        public void action(){
            System.out.println("收到命令,执行动作");
        }
    }
    创建发送者(调用者)
    Invoker.java
    package com.eric.行为型模式.命令模式.role;
    
    import com.eric.行为型模式.命令模式.command.Command;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 调用者
     * @CreateTime 2020-12-07 08:43:00
     */
    public class Invoker {
        private Command command;
        //接收命令
        public void setCommand(Command command){
            this.command = command;
        }
        //执行命令
        public void action()
        {
            this.command.execute();
        }
    }
    测试类
    Client.java
    package com.eric.行为型模式.命令模式;
    
    import com.eric.行为型模式.命令模式.command.Command;
    import com.eric.行为型模式.命令模式.command.ConcreteCommand;
    import com.eric.行为型模式.命令模式.role.Invoker;
    import com.eric.行为型模式.命令模式.role.Receiver;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 测试类
     * @CreateTime 2020-12-07 08:45:20
     */
    public class Client {
        public static void main(String[] args) {
            //调用者
            Invoker invoker = new Invoker();
            //接收者
            Receiver receiver = new Receiver();
    
            //定义一个发送给接收者的命令
            Command command = new ConcreteCommand(receiver);
            //执行
            invoker.setCommand(command);
            invoker.action();
        }
    }
    测试结果
    收到命令,执行动作


    2命令模式的应用
    a.命令模式的优点
        命令模式的优点:
      • 类间解耦。调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需要调用Command中的execute()方法即可,不需要了解是哪个接收者执行。
      • 可扩展性。Command的子类可以非常容易地扩展,而调用者Invoker和高层次的木块Client不产生严重的代码耦合。
      • 命令模式结合其他模式会更好。命令模式可以结合责任模式,事先命令组解析任务;结合模板方法模式,则可以减少Command子类的膨胀问题。
       命令模式的缺点:
      • 使用命令模式可能会导致系统中出现过多的具体命令类,因此需要在项目中慎重考虑使用。
    b.模板方法模式的应用场景
      • 使用命令模式作为“回调”在面向对象系中的替代。“回调”讲的便是将一个函数登记上,然后在以后调用此函数。
      • 需要在不同的时间制定请求、将请求排队。
      • 系统需要支持命令的撤销(Undo)。命令对象可以把状态存储起来,等到客户端需要撤销时,可以调用undo()方法,将命令所产生的效果撤销。
      • 需要 将系统中所有的数据更新操作保存到日志里,以便在系统崩溃时,可以根据日志读回所有的数据更新命令,重新调用execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所作的数据更新。
      • 一个系统需要支持交易(transaction)。一个交易结构封装了一组数据更新命令。使用命令模式来实现交易结构可以是系统增加新的交易类型。

    3命令模式的实例
    Java语言中使用了命令模式处理Java.awt的事件处理模型。
    使用Java中的事件处理演示命令模式。
    创建抽象命令接口
    MyCommand.java
    package com.eric.行为型模式.命令模式.例1.command;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 抽象命令角色
     * @CreateTime 2020-12-07 14:43:37
     */
    //抽象命令接口
    public interface MyCommand {
        public void execute();
    }
    创建MyCommand的实现类
    YellowCommand.java
    package com.eric.行为型模式.命令模式.例1.command;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 黄色实现类
     * @CreateTime 2020-12-07 14:46:21
     */
    //具体命令角色,让面板变为黄色的命令
    public class YellowCommand extends JButton implements MyCommand {
        private JPanel panel;
    
        //构造函数
        public YellowCommand(String name,JPanel panel)
        {
            //构造一个按钮控件
            super(name);
            this.panel = panel;
        }
    
        @Override
        public void execute() {
            //改变面板的背景颜色
            panel.setBackground(Color.YELLOW);
        }
    }
    RedCommand.java
    package com.eric.行为型模式.命令模式.例1.command;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 红色命令
     * @CreateTime 2020-12-07 14:52:08
     */
    public class RedCommand extends JButton implements MyCommand {
        private  JPanel panel;
    
        public RedCommand(String name,JPanel panel)
        {
            //构造一个按钮控件
            super(name);
            this.panel = panel;
        }
        @Override
        public void execute() {
            //背景变为红色
            panel.setBackground(Color.RED);
        }
    }
    ExitCommand.java
    package com.eric.行为型模式.命令模式.例1.command;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 退出命令
     * @CreateTime 2020-12-07 14:56:38
     */
    public class ExitCommand extends JButton implements MyCommand {
    
        public ExitCommand(String name)
        {
            //构造一个按钮控件
            super(name);
        }
        @Override
        public void execute() {
            //系统退出
            System.exit(0);
        }
    }
    创建窗口测试
    MyFrame.java
    package com.eric.行为型模式.命令模式.例1;
    
    import com.eric.行为型模式.命令模式.例1.command.ExitCommand;
    import com.eric.行为型模式.命令模式.例1.command.MyCommand;
    import com.eric.行为型模式.命令模式.例1.command.RedCommand;
    import com.eric.行为型模式.命令模式.例1.command.YellowCommand;
    
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    /**
     * @author Eric
     * @ProjectName my_design_23
     * @description 图形窗口
     * @CreateTime 2020-12-07 15:00:01
     */
    public class MyFrame extends JFrame implements ActionListener {
        private JPanel panel;
        private YellowCommand btnYellow;
        private RedCommand btnRed;
        private ExitCommand btnExit;
    
        public MyFrame()
        {
            super("命令模式");
            panel = new JPanel();
            this.add(panel);
    
            //实例化具体命令
            btnYellow = new YellowCommand("黄色", panel);
            btnRed = new RedCommand("红色",panel);
            btnExit = new ExitCommand("退出");
    
            //将按钮控件添加到面板
            panel.add(btnYellow);
            panel.add(btnRed);
            panel.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 obj =  (MyCommand)e.getSource();
            obj.execute();
        }
    
        public static void main(String[] args) {
            new MyFrame();
        }
    }
    测试结果






    只要你不停下来,慢一点也没关系。
  • 相关阅读:
    arp攻击 (可查看同一局域网他人手机照片)
    SQL注入(转载)
    常见文件文件头文件尾格式总结及各类文件头
    CTF
    Base64,Base32,Base16进制的区别
    Maven学习总结(二):安装
    Maven学习总结(一):基本概念
    Myeclipse下集成SVN插件
    Windows下多个JDK版本之间的切换
    java线程的常用方法
  • 原文地址:https://www.cnblogs.com/zyl-0110/p/14206016.html
Copyright © 2011-2022 走看看