本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、生活場景 1、場景描述 智能電腦的品牌越來越多,由此誕生了一款電腦控制的APP,萬能遙控器,用戶在使用遙控器的時候,可以切換為自家電視的品牌,然後對電視進行控制。 2、代碼實現 二、命令模式 1、基礎概念 命令模式屬於對象的行為 ...
本文源碼:GitHub·點這裡 || GitEE·點這裡
一、生活場景
1、場景描述
智能電腦的品牌越來越多,由此誕生了一款電腦控制的APP,萬能遙控器,用戶在使用遙控器的時候,可以切換為自家電視的品牌,然後對電視進行控制。
2、代碼實現
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);
}
}
二、命令模式
1、基礎概念
命令模式屬於對象的行為模式。命令模式把一個請求或者操作封裝到一個對象中。把發出命令的動作和執行命令的動作分割開,委派給不同的對象。命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,更不必知道請求是怎麼被接收,以及操作是否被執行。
2、模式圖解
3、核心角色
- 命令角色
聲明所有具體命令類的抽象介面。
- 具體命令角色
定義接收者和行為之間的交互方式:實現execute()方法,調用接收者的相應操作 , 傳遞命令信息。
- 請求者角色
負責調用命令對象執行請求,相關的方法叫做行動方法。
- 接收者角色
執行請求。任何一個類都可以成為接收者,執行請求的方法叫做行動方法。
4、源碼實現
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);
}
}
三、Spring框架應用
Spring框架中封裝的JdbcTemplate類API使用到了命令模式。
1、JdbcOperations介面
public interface JdbcOperations {
@Nullable
<T> T execute(StatementCallback<T> var1) ;
}
2、JdbcTemplate類
這裡只保留模式方法的代碼。
public class JdbcTemplate implements JdbcOperations {
@Nullable
public <T> T execute(StatementCallback<T> action) {
try {
T result = action.doInStatement(stmt);
} catch (SQLException var9) {
} finally {
}
}
}
3、StatementCallback介面
@FunctionalInterface
public interface StatementCallback<T> {
@Nullable
T doInStatement(Statement var1) ;
}
四、命令模式總結
- 鬆散的耦合
命令模式使得命令發起者和命令執行者解耦,發起命令的對象完全不知道具體實現對象是誰。這和常見的MQ消息隊列原理是類似的。
- 動態的控制
命令模式把請求封裝起來,可以動態地對它進行參數化、隊列化和等操作和管理,使系統更加的靈活。
- 良好的擴展性
命令發起者和命令執行者實現完全解耦,因此擴展添加新命令很容易。
五、源代碼地址
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent