命令模式
以下內(nèi)容來自百度百科。
在一般情況下,“請求者”知道“行為實現(xiàn)者”的邏輯以及步驟驱犹,也就是直接通過請求者來對實現(xiàn)者操作。命令模式讓兩者之間實現(xiàn)松耦合霸株。
請求者不知道實現(xiàn)者的具體操作,只按一定的命令便可實現(xiàn)具體操作者的功能集乔。
生活實例
在我們的現(xiàn)實生活中,電視機和遙控器就相當(dāng)于這個模式坡椒。遙控器上的按鈕就是我們的請求者扰路, 電視機是我們的“實現(xiàn)者”。當(dāng)然倔叼,使用遙控器的人就是我們的客戶端汗唱。
模式結(jié)構(gòu)
命令模式包含如下角色:
Command: 抽象命令類
抽象出一個命令的執(zhí)行類
publicinterfaceBaseCommand{
/**
*?執(zhí)行命令
*/
voidexecute();
}
ConcreteCommand: 具體命令類
不同的命令類,具體實現(xiàn)是重寫抽象命令類的方法
電視開關(guā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("電視機開關(guān)機");
}
}
Client:客戶端
我們的程序入口丈攒,相當(dāng)于一個測試類
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í)行者就不直接操作“電視”了巡验。