设计模式学习笔记—命令模式
2016-01-23 18:59
288 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LiynGu/article/details/50570868
命令模式(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 就是那两个读取数据的线程。
参考:https://www.geek-share.com/detail/2547556460.html
命令模式的话,简单理解就是这样,封装调用嘛,把需要执行的内容一层一层的传递,直到可以被执行的时候再执行。
The end.
相关文章推荐
- 步步为营 .NET 设计模式学习笔记 九、Command(命令模式)
- 设计模式学习笔记-命令模式
- 设计模式学习笔记-命令模式
- 设计模式学习笔记-命令模式
- HeadFirst 设计模式学习笔记6--命令模式
- 设计模式学习笔记(十七)——Command命令模式
- 设计模式学习笔记(一:命令模式)
- 设计模式学习笔记(十六)——Command命令
- Golang 设计模式 学习笔记(六)命令模式
- 设计模式C++学习笔记之十二(Command命令模式)
- 设计模式学习笔记之命令模式
- 【学习笔记javascript设计模式与开发实践(命令模式)----9】
- 设计模式学习笔记——命令模式
- 学习笔记:Java设计模式-命令模式
- 设计模式学习笔记--Command命令模式
- 设计模式学习笔记(十七)——Command命令模式
- 步步为营 .NET 设计模式学习笔记 九、Command(命令模式)
- 【转】设计模式学习笔记之命令模式
- 设计模式C++学习笔记之十二(Command命令模式)
- java 设计模式学习笔记十二 command命令设计模式