本文源碼:GitHub·點這裏 || GitEE·點這裏java
智能電腦的品牌愈來愈多,由此誕生了一款電腦控制的APP,萬能遙控器,用戶在使用遙控器的時候,能夠切換爲自家電視的品牌,而後對電視進行控制。git
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); } }
命令模式屬於對象的行爲模式。命令模式把一個請求或者操做封裝到一個對象中。把發出命令的動做和執行命令的動做分割開,委派給不一樣的對象。命令模式容許請求的一方和接收的一方獨立開來,使得請求的一方沒必要知道接收請求的一方的接口,更沒必要知道請求是怎麼被接收,以及操做是否被執行。github
聲明全部具體命令類的抽象接口。spring
定義接收者和行爲之間的交互方式:實現execute()方法,調用接收者的相應操做 , 傳遞命令信息。框架
負責調用命令對象執行請求,相關的方法叫作行動方法。ide
執行請求。任何一個類均可以成爲接收者,執行請求的方法叫作行動方法。this
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框架中封裝的JdbcTemplate類API使用到了命令模式。code
一、JdbcOperations接口對象
public interface JdbcOperations { @Nullable <T> T execute(StatementCallback<T> var1) ; }
二、JdbcTemplate類blog
這裏只保留模式方法的代碼。
public class JdbcTemplate implements JdbcOperations { @Nullable public <T> T execute(StatementCallback<T> action) { try { T result = action.doInStatement(stmt); } catch (SQLException var9) { } finally { } } }
三、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