zoukankan      html  css  js  c++  java
  • 命令模式(Command、Recevier、Invoker)(电脑开机命令)

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

      在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。

          命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求,这就是命令模式的动机。

          例如: 当我们进行电脑开机时,我们只需要按下开机键也就是发送开机命令,不管我们用的台式机还是笔记本、惠普的还是联想的,,我们只需要知道开机命令并且发送它,具体谁执行开机命令我们并不关心。

    定义主板:

    public interface MainBoard {
    public void open();
    }

    定义主板实现类:

    1 public class GigaMainBoard implements MainBoard {
    2 
    3     @Override
    4     public void open() {
    5     System.out.println("主板正在开机...");
    6     System.out.println("机器已经正常打开,请操作...");
    7     }
    8 
    9 }

    定义命令接口:

    public interface Command {
    public void excute();
    }

    定义命令的具体实现类:

     1 /**
     2  * 持有真正实现命令的接收者----主板对象
     3  * @author Administrator
     4  *
     5  */
     6 
     7 
     8 public class OpenCommand implements Command {
     9 
    10     private MainBoard mainboard   = null;
    11     /*
    12      * 构造方法,传入主板对象
    13      */
    14     
    15     public OpenCommand(MainBoard mainboard) {
    16         super();
    17         this.mainboard = mainboard;
    18     }
    19 
    20 
    21     @Override
    22     public void excute() {
    23     //对于命令对象,根本不知道如何开机,回转调主板对象
    24     //让主板去完成开机的功能
    25       this.mainboard.open();
    26     }
    27 
    28 }

    提供机箱:

     1 public class Box {
     2 /**
     3  *开机命令对象 
     4  */
     5 private Command opencommend;
     6 /**
     7  * 设置开机命令对象
     8  */
     9 public void setOpencommend(Command opencommend) {
    10     this.opencommend = opencommend;
    11 }
    12 /**
    13  * 提供给客户使用,接收并响应用户请求,相当于按钮被按下的触发方法
    14  */
    15 public void openButtonPressed() {
    16     //按下按钮,执行命令
    17     opencommend.excute();
    18 }
    19 
    20 }

    客户测试:

     1 public class CommandPattern {
     2 
     3     public static void main(String[] args) {
     4 //1.把命令和真正的实现组合起来,相当于在组装机器
     5 //把机箱上按钮的连接线插接到主板上
     6         
     7 //定义主板        
     8 MainBoard mainBoard = new GigaMainBoard();
     9 //定义开机命令,为开机命配备具体主板
    10 OpenCommand openCommand = new OpenCommand(mainBoard);
    11 
    12 //2.为机箱上的按钮设置对应的命令,让按钮知道该干什么
    13 
    14 //定义机箱(开机按钮)
    15 Box box = new Box();
    16 //为机箱设置开机命令
    17 box.setOpencommend(openCommand);
    18 
    19 //3.然后模拟按下机箱上的按钮
    20 box.openButtonPressed();
    21     }
    22 
    23     
    24 /*
    25  * 在客户测试步骤中我们可以发现,机箱与主板并无直接的关系,中间由开机命令链接
    26  * 机箱只知道可以机箱发送开机的命令有对象去执行,不需要知道执行命令的主板是哪个
    27  */
    28 }

    运行结果:

    主板正在开机...
    机器已经正常打开,请操作...
    惠普的还是联想的,
    [Huìpǔ de háishì liánxiǎng de,]
    HP or Lenovo,
  • 相关阅读:
    Linux 修改 root密码
    python实现 CI/CD(jenkins+gitlab)
    redis集群
    土木工程材料0732
    C语言程序设计【1032】
    汽车文化【1196】
    应用写作0045
    思想道德修养与法律基础[1053]
    英语【0002】
    社区管理【0272】
  • 原文地址:https://www.cnblogs.com/the-wang/p/7294118.html
Copyright © 2011-2022 走看看