• 设计模式命令模式


    命令模式

    概述:

      有三个对象:接收者,调用者,命令

      场合:调用者需要让接收者执行其方法,将接收者和调用者解耦

    以下是个人的分析与理解:

      调用者需要让接受者做某事,我们完全可以这样做:调用者中包含接受者的引用,并调用其方法。但是这样通过硬编码的实现方式,使得调用者与接受者之间是强耦合的。一个解决此问题的方法便是:命令模式。

      建立命令模式的步骤:

        1. 建立一个命令Command接口,包含一个execute()方法。

        2. 建立一个CommandImpl类,实现Command接口;包含一个Accepter接受者,覆写execute方法时,调用Accpter具体方法。

        3. 建立一个Invoker调用类,包含一个setCommand()方法,通过此方法将Command注入;并封装Command的execute()方法。

      显然,调用链为:Invoker的方法 -> 调用Command的execute() -> 调用Accpter的方法。

      这样,Command就如一个中间桥梁一样,使得Invoker和Acceper之间解耦:Invoker无需关注Accepter有哪些方法,它只需调用Command的execute()方法,就可达到调用Accepter的方法。

    实现:

      Accepter:

    1 public class Accepter {
    2     
    3     public void doSomething() {
    4         System.out.println("im accepter, i do something.");
    5     }
    6     
    7 }

      Command接口:

    1 public interface Command {
    2     public void execute();
    3 }

      CommandImpl:

     1 public class CommandImpl implements Command {
     2     
     3     private Accepter accepter;
     4     
     5     public CommandImpl(Accepter accepter) {
     6         this.accepter = accepter;
     7     }
     8     
     9     public void setAccepter(Accepter accepter) {
    10         this.accepter = accepter;
    11     }
    12     
    13     @Override
    14     public void execute() {
    15         // TODO Auto-generated method stub
    16         accepter.doSomething();
    17     }
    18 
    19 }

    Invoker:

     1 public class Invoker {
     2     
     3     private Command command;
     4     
     5     public Invoker() {}
     6     
     7     public Invoker(Command command) {
     8         this.command = command;
     9     }
    10     
    11     public void setCommand(Command command) {
    12         this.command = command;
    13     }
    14     
    15     public void doSomething() {
    16         command.execute();
    17     }
    18 }

    Client:

     1 public class Client {
     2     
     3     public static void main(String[] args) {
     4         Accepter accepter = new Accepter();
     5         Command command = new CommandImpl(accepter);
     6         Invoker invoker = new Invoker();
     7         
     8         invoker.setCommand(command);
     9         invoker.doSomething();
    10     }
    11     
    12 }

    运行结果:

    1 im accepter, i do something.
  • 相关阅读:
    css 垂直居中
    pdf.js 标题修改
    electron 打包时文件复制到程序目录下
    js 高阶函数
    计算一个数字是否素数
    Object.assign()
    vue 路由页面 首次打开浏览器 返回上一页异常问题
    swagger使用报错:No enum constant org.springframework.web.bind.annotation.RequestMethod.get
    idea 关于查询的快捷键
    域渗透之CrackMapExec
  • 原文地址:https://www.cnblogs.com/forstudy/p/3025185.html
Copyright © 2020-2023  润新知