• 设计模式之命令者


    如老板命令你完成一个OA项目是一个命令,接着看看其特点:

    1、在上面的命令中,命令的执行者肯定是聪明的你了。具体的执行方法,可能是通过vs实现,或者是通过eclipse实现,由此看来:命令要有个命令的执行者,还要有个命令的执行方法。

    2、命令的发出者很明显是老板,老板还有个发出方法,可能是通过电话给你说,也可能给你邮件给你说,也可能是通过开会给你说。所以命令的发出者要有一个命令,还要有个发出的方法。

    3、最后看看命令,命令有个名字,命令的肯定要执行。而且命令是在boss给你发出通知后执行的。

    定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

    它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题

    Command模式可应用于
    a)整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
    b)调用前后需要对调用参数进行某些处理。
    c)调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

    Command模式有如下效果:
    a)将调用操作的对象和知道如何实现该操作的对象解耦。
    b)Command是头等对象。他们可以像其他对象一样被操作和扩展。
    c)你可将多个命令装配成一个符合命令。
    d)增加新的Command很容易,因为这无需改变现有的类。

    2.UML

    3.代码

    复制代码
    public interface Command {
    public void execute();
    }


    public class ConcreteCommand implements Command {

    private Receiver receiver = null;
    private String state;

    public ConcreteCommand(Receiver receiver){
    this.receiver = receiver;
    }
    public void execute() {
    receiver.action();
    }
    }


    public class Receiver {
    public void action(){
    //真正执行命令操作的功能代码
    }
    }


    public class Invoker {
    private Command command = null;

    public void setCommand(Command command) {
    this.command = command;
    }

    public void runCommand() {
    command.execute();
    }
    }

    public class Client {
    public void assemble(){
    //创建接收者
    Receiver receiver = new Receiver();
    //创建命令对象,设定它的接收者
    Command command = new ConcreteCommand(receiver);
    //创建Invoker,把命令对象设置进去
    Invoker invoker = new Invoker();
    invoker.setCommand(command);
    }
    }
    复制代码
    复制代码
    下面给个例子,是模拟对电视机的操作有开机、关机、换台命令。代码如下

    //命令接收者
    public class Tv {
      public int currentChannel = 0;

      public void turnOn() {
       System.out.println("The televisino is on.");
      }

      public void turnOff() {
       System.out.println("The television is off.");
      }

      public void changeChannel(int channel) {
       this.currentChannel = channel;
       System.out.println("Now TV channel is " + channel);
      }
    }

    //执行命令的接口
    public interface Command {
      void execute();
    }

    //开机命令
    public class CommandOn implements Command {
      private Tv myTv;

      public CommandOn(Tv tv) {
       myTv = tv;
      }

      public void execute() {
       myTv.turnOn();
      }
    }

    //关机命令
    public class CommandOff implements Command {
      private Tv myTv;

      public CommandOff(Tv tv) {
       myTv = tv;
      }

      public void execute() {
       myTv.turnOff();
      }
    }

    //频道切换命令
    public class CommandChange implements Command {
      private Tv myTv;

      private int channel;

      public CommandChange(Tv tv, int channel) {
       myTv = tv;
       this.channel = channel;
      }

      public void execute() {
       myTv.changeChannel(channel);
      }
    }

    //可以看作是遥控器吧
    public class Control {
      private Command onCommand, offCommand, changeChannel;

      public Control(Command on, Command off, Command channel) {
       onCommand = on;
       offCommand = off;
       changeChannel = channel;
      }

      public void turnOn() {
       onCommand.execute();
      }

      public void turnOff() {
       offCommand.execute();
      }

      public void changeChannel() {
       changeChannel.execute();
      }
    }

    //测试类
    public class Client {
      public static void main(String[] args) {
       // 命令接收者
       Tv myTv = new Tv();
       // 开机命令
       CommandOn on = new CommandOn(myTv);
       // 关机命令
       CommandOff off = new CommandOff(myTv);
       // 频道切换命令
       CommandChange channel = new CommandChange(myTv, 2);
       // 命令控制对象
       Control control = new Control(on, off, channel);

       // 开机
       control.turnOn();
       // 切换频道
       control.changeChannel();
       // 关机
       control.turnOff();
      }
    }


    执行结果为:
    The televisino is on.
    Now TV channel is 2
    The television is off.


    参考:http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html
    http://www.cnblogs.com/lzhp/p/3395320.html
    http://haolloyin.blog.51cto.com/1177454/339076/
    http://blog.csdn.net/jason0539/article/details/45110355
    http://www.cnblogs.com/ikuman/archive/2013/08/06/3233092.html
  • 相关阅读:
    Mysql 5.7解压版安装
    Java Web 整合案例
    maven 创建Java web项目
    LintCode 数字三角形
    Hibernate 泛型Dao实现
    LintCode 将二叉查找树转换成双链表
    LintCode 删除链表中倒数第n个节点
    LintCode 二级制中有多少个1
    LintCode翻转二叉树
    SpringMVC 运行流程
  • 原文地址:https://www.cnblogs.com/manmanlu/p/5726703.html
Copyright © 2020-2023  润新知