命令模式

2018-12-07  本文已影响0人  小菜鸟学Android

命令模式

以下内容来自百度百科。

在一般情况下,“请求者”知道“行为实现者”的逻辑以及步骤,也就是直接通过请求者来对实现者操作。命令模式让两者之间实现松耦合。

请求者不知道实现者的具体操作,只按一定的命令便可实现具体操作者的功能。

生活实例

在我们的现实生活中,电视机和遥控器就相当于这个模式。遥控器上的按钮就是我们的请求者, 电视机是我们的“实现者”。当然,使用遥控器的人就是我们的客户端。

模式结构

命令模式包含如下角色:

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;

}

}

}

测试结果以及总结

通过命令模式,就把执行和“电视”分离出来,执行者就不直接操作“电视”了。

上一篇 下一篇

猜你喜欢

热点阅读