命令模式

命令模式

以下內(nèi)容來自百度百科。

在一般情況下,“請求者”知道“行為實現(xiàn)者”的邏輯以及步驟,也就是直接通過請求者來對實現(xiàn)者操作。命令模式讓兩者之間實現(xiàn)松耦合。

請求者不知道實現(xiàn)者的具體操作,只按一定的命令便可實現(xiàn)具體操作者的功能。

生活實例

在我們的現(xiàn)實生活中,電視機和遙控器就相當于這個模式。遙控器上的按鈕就是我們的請求者, 電視機是我們的“實現(xiàn)者”。當然,使用遙控器的人就是我們的客戶端。

模式結(jié)構(gòu)

命令模式包含如下角色:

Command: 抽象命令類

抽象出一個命令的執(zhí)行類

publicinterfaceBaseCommand{

/**

*?執(zhí)行命令

*/

voidexecute();

}

ConcreteCommand: 具體命令類

不同的命令類,具體實現(xiàn)是重寫抽象命令類的方法

電視開關機命令

publicclassTVOnOffCommandimplementsBaseCommand{

privateTV?tv;

publicTVOnOffCommand(TV?tv){

this.tv?=?tv;

}

@Override

publicvoidexecute(){

tv.onOff();

}

}

頻道加命令

publicclassChannelUpCommandimplementsBaseCommand{

privateTV?tv;

publicChannelUpCommand(TV?tv){

this.tv?=?tv;

}

@Override

publicvoidexecute(){

tv.channelUp();

}

}

頻道減命令

publicclassChannelDownCommandimplementsBaseCommand{

privateTV?tv;

publicChannelDownCommand(TV?tv){

this.tv?=?tv;

}

@Override

publicvoidexecute(){

tv.channelDown();

}

}

Invoker: 調(diào)用者

通過調(diào)用者來執(zhí)行這個命令

publicclassInvoker{

privateHashMap?commands;

privateBaseCommand?command;

publicInvoker(){

commands?=newHashMap<>();

}

/**

*?根據(jù)位置把命令存起來

*?@param?position

*?@param?command

*/

publicvoidsetCommands(intposition,?BaseCommand?command){

commands.put(position,?command);

}

/**

*?根據(jù)位置去發(fā)送命令

*?@param?position

*/

publicvoidexecuteCommand(intposition){

command?=?commands.get(position);

if(command?!=null)?{

command.execute();

}

}

}

Receiver: 接收者

實現(xiàn)者本身

publicclassTV{

publicTV(){?}

publicvoidchannelUp(){

System.out.println("電視機頻道加");

}

publicvoidchannelDown(){

System.out.println("電視機頻道減");

}

publicvoidonOff(){

System.out.println("電視機開關機");

}

}

Client:客戶端

我們的程序入口,相當于一個測試類

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{

privateButton?btPerform;

privateButton?btUp;

privateButton?btDown;

privateInvoker?invoker;

@Override

protectedvoidonCreate(Bundle?savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

initData();

}

privatevoidinitView(){

btPerform?=?findViewById(R.id.bt_perform);

btPerform.setOnClickListener(this);

btDown?=?findViewById(R.id.bt_down);

btDown.setOnClickListener(this);

btUp?=?findViewById(R.id.bt_up);

btUp.setOnClickListener(this);

//context?=?new?Context(5);

}

privatevoidinitData(){

TV?tv?=newTV();

BaseCommand?onOffCommand?=newTVOnOffCommand(tv);

BaseCommand?channelDownCommand?=newChannelDownCommand(tv);

BaseCommand?channelUpCommand?=newChannelUpCommand(tv);

invoker?=newInvoker();

invoker.setCommands(1,?onOffCommand);

invoker.setCommands(2,?channelUpCommand);

invoker.setCommands(3,?channelDownCommand);

}

@Override

publicvoidonClick(View?v){

switch(v.getId())?{

caseR.id.bt_perform:?{

invoker.executeCommand(1);

break;

}

caseR.id.bt_up:?{

invoker.executeCommand(2);

break;

}

caseR.id.bt_down:?{

invoker.executeCommand(3);

break;

}

default:

break;

}

}

}

測試結(jié)果以及總結(jié)

通過命令模式,就把執(zhí)行和“電視”分離出來,執(zhí)行者就不直接操作“電視”了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容