您的位置:首页 > 其它

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

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.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: