博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-命令模式
阅读量:5886 次
发布时间:2019-06-19

本文共 3543 字,大约阅读时间需要 11 分钟。

命令模式

以下内容来自百度百科。

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

生活实例

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

模式结构

命令模式包含如下角色:

  • 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 HashMap
commands; 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;        }    }}复制代码

总结

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

转载地址:http://ohmix.baihongyu.com/

你可能感兴趣的文章
IntelliJ IDEA 2018.1.3 + jdk1.8 安装教程
查看>>
命令行输出java版本与环境变量配置的不一样问题解决
查看>>
你们终于喊出自己就是公有云了?
查看>>
帝国的征程——一个国家如何获得五大流氓的地位[转]
查看>>
Spring Security教程之自定义Spring Security默认的403页面
查看>>
WebMagic使用说明-基本的爬虫
查看>>
前嗅网络的ForeLib数据库介绍
查看>>
exchange 中继
查看>>
电脑蓝屏修复过程
查看>>
vmware ESXI 之重新注册虚拟机
查看>>
Apache Zeppelin安装及使用
查看>>
外网无法访问云主机HDFS文件系统
查看>>
hovercard头像悬浮卡效果
查看>>
mysql5.7.18安装
查看>>
进程间通信(共享内存),五种通信方式简单总结
查看>>
NAT技术和代理服务器
查看>>
xmanager远程连接linux配置
查看>>
Linux下Tomcat启动报Can't connect to X11 window server
查看>>
真正从零开始,TensorFlow详细安装入门图文教程!
查看>>
PHP 中 $_FILES
查看>>