本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
從策劃到設(shè)計(jì)制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、域名與空間、網(wǎng)頁空間、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、 網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進(jìn)步。
智能電腦的品牌越來越多,由此誕生了一款電腦控制的APP,萬能遙控器,用戶在使用遙控器的時(shí)候,可以切換為自家電視的品牌,然后對(duì)電視進(jì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 ;
}
@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+";執(zhí)行:"+task);
}
}
命令模式屬于對(duì)象的行為模式。命令模式把一個(gè)請(qǐng)求或者操作封裝到一個(gè)對(duì)象中。把發(fā)出命令的動(dòng)作和執(zhí)行命令的動(dòng)作分割開,委派給不同的對(duì)象。命令模式允許請(qǐng)求的一方和接收的一方獨(dú)立開來,使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,更不必知道請(qǐng)求是怎么被接收,以及操作是否被執(zhí)行。
聲明所有具體命令類的抽象接口。
定義接收者和行為之間的交互方式:實(shí)現(xiàn)execute()方法,調(diào)用接收者的相應(yīng)操作 , 傳遞命令信息。
負(fù)責(zé)調(diào)用命令對(duì)象執(zhí)行請(qǐng)求,相關(guān)的方法叫做行動(dòng)方法。
執(zhí)行請(qǐng)求。任何一個(gè)類都可以成為接收者,執(zhí)行請(qǐng)求的方法叫做行動(dòng)方法。
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;
}
@Override
public void execute(String task) {
//接收方來真正執(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框架中封裝的JdbcTemplate類API使用到了命令模式。
1、JdbcOperations接口
public interface JdbcOperations {
@Nullable
T execute(StatementCallback var1) ;
}
2、JdbcTemplate類
這里只保留模式方法的代碼。
public class JdbcTemplate implements JdbcOperations {
@Nullable
public T execute(StatementCallback action) {
try {
T result = action.doInStatement(stmt);
} catch (SQLException var9) {
} finally {
}
}
}
3、StatementCallback接口
@FunctionalInterface
public interface StatementCallback {
@Nullable
T doInStatement(Statement var1) ;
}
命令模式使得命令發(fā)起者和命令執(zhí)行者解耦,發(fā)起命令的對(duì)象完全不知道具體實(shí)現(xiàn)對(duì)象是誰。這和常見的MQ消息隊(duì)列原理是類似的。
命令模式把請(qǐng)求封裝起來,可以動(dòng)態(tài)地對(duì)它進(jìn)行參數(shù)化、隊(duì)列化和等操作和管理,使系統(tǒng)更加的靈活。
命令發(fā)起者和命令執(zhí)行者實(shí)現(xiàn)完全解耦,因此擴(kuò)展添加新命令很容易。
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent