Java描述設計模式(20):命令模式

本文源碼:GitHub·點這裏 || GitEE·點這裏java

1、生活場景

一、場景描述

智能電腦的品牌愈來愈多,由此誕生了一款電腦控制的APP,萬能遙控器,用戶在使用遙控器的時候,能夠切換爲自家電視的品牌,而後對電視進行控制。

二、代碼實現

public class C01_InScene {
    public static void main(String[] args) {
        TVClient tvClient = new TVClient() ;
        Remote remote = new RemoteApp(tvClient) ;
        UserClient userClient = new UserClient(remote) ;
        userClient.action("HM","換臺");
    }
}
/**
 * 遙控接口
 */
interface Remote {
    void controlTV (String tvType,String task);
}
/**
 * 遙控器APP
 */
class RemoteApp implements Remote {
    private TVClient tvClient = null ;
    public RemoteApp (TVClient tvClient){
        this.tvClient = tvClient ;
    }
    @Override
    public void controlTV(String tvType, String task) {
        tvClient.action(tvType,task);
    }
}
/**
 * 用戶端
 */
class UserClient {
    // 持有遙控器
    private Remote remote = null ;
    public UserClient (Remote remote){
        this.remote = remote ;
    }
    public void action (String tvType, String task){
        remote.controlTV(tvType,task);
    }
}
/**
 * 電視端
 */
class TVClient {
    public void action (String tvType, String task){
        System.out.println("TV品牌:"+tvType+";執行:"+task);
    }
}

2、命令模式

一、基礎概念

命令模式屬於對象的行爲模式。命令模式把一個請求或者操做封裝到一個對象中。把發出命令的動做和執行命令的動做分割開,委派給不一樣的對象。命令模式容許請求的一方和接收的一方獨立開來,使得請求的一方沒必要知道接收請求的一方的接口,更沒必要知道請求是怎麼被接收,以及操做是否被執行。

二、模式圖解

20-1.png

三、核心角色

  • 命令角色
聲明全部具體命令類的抽象接口。
  • 具體命令角色
定義接收者和行爲之間的交互方式:實現execute()方法,調用接收者的相應操做 , 傳遞命令信息。
  • 請求者角色
負責調用命令對象執行請求,相關的方法叫作行動方法。
  • 接收者角色
執行請求。任何一個類均可以成爲接收者,執行請求的方法叫作行動方法。

四、源碼實現

public class C02_Command {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker(command);
        invoker.action("臥倒");
    }
}
/**
 * 命令角色
 */
interface Command {
    // 執行方法
    void execute(String task);
}
/**
 * 具體命令角色類
 */
class ConcreteCommand implements Command {
    //持有相應的接收者對象
    private Receiver receiver = null;
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    @Override
    public void execute(String task) {
        //接收方來真正執行請求
        receiver.action(task);
    }
}
/**
 * 請求者角色類
 */
class Invoker {
    // 持有命令對象
    private Command command = null;
    public Invoker(Command command){
        this.command = command;
    }
    // 行動方法
    public void action(String task){
        command.execute(task);
    }
}
/**
 * 接收者角色類
 */
class Receiver {
    // 執行命令操做
    public void action(String task){
        System.out.println("執行命令:"+task);
    }
}

3、Spring框架應用

Spring框架中封裝的JdbcTemplate類API使用到了命令模式。git

一、JdbcOperations接口github

public interface JdbcOperations {
    @Nullable
    <T> T execute(StatementCallback<T> var1) ;
}

二、JdbcTemplate類segmentfault

這裏只保留模式方法的代碼。框架

public class JdbcTemplate implements JdbcOperations {
    @Nullable
    public <T> T execute(StatementCallback<T> action) {
        try {
            T result = action.doInStatement(stmt);
        } catch (SQLException var9) {
        } finally {
        }
    }
}

三、StatementCallback接口ide

@FunctionalInterface
public interface StatementCallback<T> {
    @Nullable
    T doInStatement(Statement var1) ;
}

4、命令模式總結

  • 鬆散的耦合
命令模式使得命令發起者和命令執行者解耦,發起命令的對象徹底不知道具體實現對象是誰。這和常見的MQ消息隊列原理是相似的。
  • 動態的控制
命令模式把請求封裝起來,能夠動態地對它進行參數化、隊列化和等操做和管理,使系統更加的靈活。
  • 良好的擴展性
命令發起者和命令執行者實現徹底解耦,所以擴展添加新命令很容易。

5、源代碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

相關文章
相關標籤/搜索