Java描述设计模式(20):命令模式
本文源碼: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)題。
- 上一篇: JSF 源代码赏析之FacesServl
- 下一篇: java美元兑换,(Java实现) 美元