设计模式学习笔记—命令模式

命令模式(Command Pattern)

如果是一些需要在特定时候,或者需要当某些指令执行完毕之后才能执行的指令,那么就需要命令模式了。

其实最开始感觉 Thread 比较像,丢给它一个 Runnable 然后 start 的时候去执行,然而,Thread 里面有些 native 方法,所以,但感觉上比较像。
然后,命令模式的话,Android 更新 UI 中好像有这种,为什么选这种方法更新 UI 也是因为它和命令模式比较像。

public class Main {
    public static void main(String[] args) {
        Runnable setTextCommand = new Runnable() {
            @Override
            public void run() {
                System.out.println("setText");
            }
        };

        Handler handler = new Handler();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("reading data");
                handle.post(setTextCommand);
            }
        });
        thread.start();
    }
}
public class Handler {
    public void post(Runnable runnable) {
        // 真正的 Handler 中应该是吧这个线程转交给 UI 线程队列 - -
        new Thread(runnable).start();
    }
}

然而,这个因为线程比较特殊,所以看起来代码怪怪的,分不清哪是命令模式的设计,哪里是线程的应用,所以,要开始改名字。

public class Main {
    public static void main(String[] args) {
        // 以下是两个实现了 Command 接口的命令,这样匿名内部类的写法等同于持有了当前这个类的对象
        Command setTextCommand = new Command() {
            @Override
            public void execute() {
                System.out.println("set text");
            }
        };

        Command setImageCommand = new Command() {
            @Override
            public void execute() {
                System.out.println("set image");
            }
        };

        // 一般来说,耗时操作会另启一个线程,所以有了下面两个不同情况下的调用
        Thread loadBookThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("reading book");
                Handler handler = new Handler();
                // 如果读取好了数据,就把需要执行的更新送给 handler,由 handler 进行处理
                handler.post(setTextCommand);
                handler.post(setImageCommand);
            }
        });
        loadBookThread.start();

        Thread loadMusicThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("reading music");
                Handler handler = new Handler();
                // 如果读取好了数据,就把需要执行的更新送给 handler,由 handler 进行处理
                handler.post(setTextCommand);
            }
        });
        loadMusicThread.start();
    }
}
public class Handler {
    public void post(Command command) {
        // 这里的话就直接由 handler 去执行命令
        command.execute();
    }
}
// 这个方法中只有一个执行方法,很明显是对于 Runnable
public interface Command {
    void execute();
}

按照网上能查到的 UML 图来说,大致上可以有这样的对应
Receiver 就是当前这个新建 Command 的类,它的 action 方法,就是在 command 方法中做的更新 UI 的处理。
ConcreteCommand 就是这个匿名内部类了。
Invoker 就是 Handler。
Client 就是那两个读取数据的线程。
参考:http://blog.csdn.net/zhengzhb/article/details/7550895

命令模式的话,简单理解就是这样,封装调用嘛,把需要执行的内容一层一层的传递,直到可以被执行的时候再执行。

The end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Shell命令时,以下是一些重要的注意事项和学习建议: 1. 基本语法:Shell命令通常由命令名称和参数组成。命令名称是要执行的操作,而参数则提供了命令所需的信息。了解Shell命令的基本语法是学习的第一步。 2. 命令帮助:大多数Shell都提供了内置的命令帮助功能。通过使用命令后跟`--help`或`-h`选项,或者使用`man`命令(例如`man ls`)来获取有关特定命令的详细信息。 3. 常用命令:有一些常见的Shell命令对于日常使用非常有用。这些包括`cd`(更改目录)、`ls`(列出目录内容)、`mkdir`(创建目录)、`rm`(删除文件或目录)等。逐步学习和掌握这些命令是很重要的。 4. 管道和重定向:Shell命令非常强大,可以通过管道和重定向符号将多个命令组合在一起。了解如何使用管道(`|`)将一个命令的输出作为另一个命令的输入,并使用重定向符号(`>`、`>>`、`<`)来控制输入和输出。 5. 脚本编写:Shell脚本是一种将多个命令组合在一起以自动化任务的方法。学习如何编写简单的Shell脚本可以提高工作效率。 6. 实践和练习:最重要的是进行实践和练习。尝试使用不同的Shell命令来完成各种任务,并在实际场景中应用所学知识。 记住,Shell命令学习是一个逐步的过程。开始时可能会有些困惑,但随着实践和经验的积累,你会变得越来越熟练。希望这些提示对你有帮助!如有任何具体问题,随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值