命令模式
以下内容来自百度百科。
在一般情况下,“请求者”知道“行为实现者”的逻辑以及步骤,也就是直接通过请求者来对实现者操作。命令模式让两者之间实现松耦合。 请求者不知道实现者的具体操作,只按一定的命令便可实现具体操作者的功能。
生活实例
在我们的现实生活中,电视机和遥控器就相当于这个模式。遥控器上的按钮就是我们的请求者, 电视机是我们的“实现者”。当然,使用遥控器的人就是我们的客户端。
模式结构
命令模式包含如下角色:
- Command: 抽象命令类
抽象出一个命令的执行类
public interface BaseCommand { /** * 执行命令 */ void execute();}复制代码
- ConcreteCommand: 具体命令类
不同的命令类,具体实现是重写抽象命令类的方法
电视开关机命令
public class TVOnOffCommand implements BaseCommand{ private TV tv; public TVOnOffCommand(TV tv) { this.tv = tv; } @Override public void execute() { tv.onOff(); }}复制代码
频道加命令
public class ChannelUpCommand implements BaseCommand { private TV tv; public ChannelUpCommand(TV tv) { this.tv = tv; } @Override public void execute() { tv.channelUp(); }}复制代码
频道减命令
public class ChannelDownCommand implements BaseCommand { private TV tv; public ChannelDownCommand(TV tv) { this.tv = tv; } @Override public void execute() { tv.channelDown(); }}复制代码
- Invoker: 调用者
通过调用者来执行这个命令
public class Invoker { private HashMapcommands; private BaseCommand command; public Invoker() { commands = new HashMap<>(); } /** * 根据位置把命令存起来 * @param position * @param command */ public void setCommands(int position, BaseCommand command) { commands.put(position, command); } /** * 根据位置去发送命令 * @param position */ public void executeCommand(int position) { command = commands.get(position); if (command != null) { command.execute(); } }}复制代码
- Receiver: 接收者
实现者本身
public class TV { public TV() { } public void channelUp() { System.out.println("电视机频道加"); } public void channelDown() { System.out.println("电视机频道减"); } public void onOff() { System.out.println("电视机开关机"); }}复制代码
- Client:客户端
我们的程序入口,相当于一个测试类
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btPerform; private Button btUp; private Button btDown; private Invoker invoker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } private void initView() { 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); } private void initData() { TV tv = new TV(); BaseCommand onOffCommand = new TVOnOffCommand(tv); BaseCommand channelDownCommand = new ChannelDownCommand(tv); BaseCommand channelUpCommand = new ChannelUpCommand(tv); invoker = new Invoker(); invoker.setCommands(1, onOffCommand); invoker.setCommands(2, channelUpCommand); invoker.setCommands(3, channelDownCommand); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_perform: { invoker.executeCommand(1); break; } case R.id.bt_up: { invoker.executeCommand(2); break; } case R.id.bt_down: { invoker.executeCommand(3); break; } default: break; } }}复制代码
总结
通过命令模式,就把执行和“电视”分离出来,执行者就不直接操作“电视”了。