命令模式
命令模式
以下内容来自百度百科。
在一般情况下,“请求者”知道“行为实现者”的逻辑以及步骤,也就是直接通过请求者来对实现者操作。命令模式让两者之间实现松耦合。
请求者不知道实现者的具体操作,只按一定的命令便可实现具体操作者的功能。
生活实例
在我们的现实生活中,电视机和遥控器就相当于这个模式。遥控器上的按钮就是我们的请求者, 电视机是我们的“实现者”。当然,使用遥控器的人就是我们的客户端。
模式结构
命令模式包含如下角色:
Command: 抽象命令类
抽象出一个命令的执行类
publicinterfaceBaseCommand{
/**
* 执行命令
*/
voidexecute();
}
ConcreteCommand: 具体命令类
不同的命令类,具体实现是重写抽象命令类的方法
电视开关机命令
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: 调用者
通过调用者来执行这个命令
publicclassInvoker{
privateHashMap commands;
privateBaseCommand command;
publicInvoker(){
commands =newHashMap<>();
}
/**
* 根据位置把命令存起来
* @param position
* @param command
*/
publicvoidsetCommands(intposition, BaseCommand command){
commands.put(position, command);
}
/**
* 根据位置去发送命令
* @param position
*/
publicvoidexecuteCommand(intposition){
command = commands.get(position);
if(command !=null) {
command.execute();
}
}
}
Receiver: 接收者
实现者本身
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;
}
}
}
测试结果以及总结
通过命令模式,就把执行和“电视”分离出来,执行者就不直接操作“电视”了。