日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java描述设计模式(20):命令模式

發(fā)布時(shí)間:2025/3/16 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java描述设计模式(20):命令模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、生活場(chǎng)景

1、場(chǎng)景描述

智能電腦的品牌越來(lái)越多,由此誕生了一款電腦控制的APP,萬(wàn)能遙控器,用戶在使用遙控器的時(shí)候,可以切換為自家電視的品牌,然后對(duì)電視進(jìn)行控制。

2、代碼實(shí)現(xiàn)

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","換臺(tái)");} } /*** 遙控接口*/ interface Remote {void controlTV (String tvType,String task); } /*** 遙控器APP*/ class RemoteApp implements Remote {private TVClient tvClient = null ;public RemoteApp (TVClient tvClient){this.tvClient = tvClient ;}@Overridepublic 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+";執(zhí)行:"+task);} }

二、命令模式

1、基礎(chǔ)概念

命令模式屬于對(duì)象的行為模式。命令模式把一個(gè)請(qǐng)求或者操作封裝到一個(gè)對(duì)象中。把發(fā)出命令的動(dòng)作和執(zhí)行命令的動(dòng)作分割開(kāi),委派給不同的對(duì)象。命令模式允許請(qǐng)求的一方和接收的一方獨(dú)立開(kāi)來(lái),使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,更不必知道請(qǐng)求是怎么被接收,以及操作是否被執(zhí)行。

2、模式圖解

3、核心角色

  • 命令角色

聲明所有具體命令類的抽象接口。

  • 具體命令角色

定義接收者和行為之間的交互方式:實(shí)現(xiàn)execute()方法,調(diào)用接收者的相應(yīng)操作 , 傳遞命令信息。

  • 請(qǐng)求者角色

負(fù)責(zé)調(diào)用命令對(duì)象執(zhí)行請(qǐng)求,相關(guān)的方法叫做行動(dòng)方法。

  • 接收者角色

執(zhí)行請(qǐng)求。任何一個(gè)類都可以成為接收者,執(zhí)行請(qǐng)求的方法叫做行動(dòng)方法。

4、源碼實(shí)現(xiàn)

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 {// 執(zhí)行方法void execute(String task); } /*** 具體命令角色類*/ class ConcreteCommand implements Command {//持有相應(yīng)的接收者對(duì)象private Receiver receiver = null;public ConcreteCommand(Receiver receiver){this.receiver = receiver;}@Overridepublic void execute(String task) {//接收方來(lái)真正執(zhí)行請(qǐng)求receiver.action(task);} } /*** 請(qǐng)求者角色類*/ class Invoker {// 持有命令對(duì)象private Command command = null;public Invoker(Command command){this.command = command;}// 行動(dòng)方法public void action(String task){command.execute(task);} } /*** 接收者角色類*/ class Receiver {// 執(zhí)行命令操作public void action(String task){System.out.println("執(zhí)行命令:"+task);} }

三、Spring框架應(yīng)用

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

1、JdbcOperations接口

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

2、JdbcTemplate類

這里只保留模式方法的代碼。

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

3、StatementCallback接口

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

四、命令模式總結(jié)

  • 松散的耦合

命令模式使得命令發(fā)起者和命令執(zhí)行者解耦,發(fā)起命令的對(duì)象完全不知道具體實(shí)現(xiàn)對(duì)象是誰(shuí)。這和常見(jiàn)的MQ消息隊(duì)列原理是類似的。

  • 動(dòng)態(tài)的控制

命令模式把請(qǐng)求封裝起來(lái),可以動(dòng)態(tài)地對(duì)它進(jìn)行參數(shù)化、隊(duì)列化和等操作和管理,使系統(tǒng)更加的靈活。

  • 良好的擴(kuò)展性

命令發(fā)起者和命令執(zhí)行者實(shí)現(xiàn)完全解耦,因此擴(kuò)展添加新命令很容易。

五、源代碼地址

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

總結(jié)

以上是生活随笔為你收集整理的Java描述设计模式(20):命令模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。