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

    命令模式

    概述:

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

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

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

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

      建立命令模式的步骤:

        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.
  • 相关阅读:
    费曼学习法
    Ubuntu修改系统默认编码
    如何在Ubuntu 18.04上安装和使用PostgreSQL
    Bash简介 & Bash是如何处理命令的
    ubuntu环境变量的三种设置方法
    psql 工具详细使用介绍
    使用ubuntu server18.04 搭建odoo12运行环境
    Ubuntu修改时区和更新时间
    Ubuntu18.04修改apt-get源
    对表内数据间隔特定的长度求和
  • 原文地址:https://www.cnblogs.com/forstudy/p/3025185.html
Copyright © 2011-2022 走看看