首页 > 编程语言 >Android设计模式系列(7)--SDK源码之命令模式

Android设计模式系列(7)--SDK源码之命令模式

时间:2022-11-22 11:39:36浏览次数:40  
标签:Runnable run target Thread -- 命令 源码 设计模式 public


命令模式,在.net,java平台的事件机制用的非常多,几乎每天都与之打交道。
android中对我印象最深的就是多线程多进程的环境,所以必然大量使用到Runbable,Thread,其实用的就是最简单的命令模式。
命令模式,Command Pattern,把请求封装为一个对象,多么巧妙的一个说法啊。

1.意图

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

2.结构

Android设计模式系列(7)--SDK源码之命令模式_封装


Command接口提供了Execute方法,客户端通过Invoker调用命令操作来调用Recriver,绕了一大圈,但是却把具体对Receiver的操作请求封装在具体的命令中,是客户端对recriver的操作清晰简明。

但是在实际项目中,我们常常忽略Receiver,而把命令对象的目标对象直接设置为子类自己的成员变量或者作为execute()方法的临时变量。

以Android中的Runnable(在java.lang包下)为例,我们画出UML结构图如下:

Android设计模式系列(7)--SDK源码之命令模式_客户端_02


想不到我们天天写的代码无意识中就是用到了命令模式,所谓模式,就是无所不在。

3.代码
命令接口Runnable定义如下:

public interface Runnable {
public abstract void run();
}

调用者Thread简化版代码:

//命令模式这里不需要继承Runnable接口,但是这里考虑到实际情况,比如方便性等,继承了Runnable接口,实现了run方法,这个是Thread自身的运行run的方法
class Thread implements Runnable {
private Runnable target;

public Thread(Runnable target) {
this.target = target;
}

public synchronized void start() {

if (threadStatus != 0 || this != me)
throw new IllegalThreadStateException();
group.add(this);
start0();//这个是本地方法,调用run方法
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}

//可选
public void run() {
if (target != null) {
target.run();
}
}
}

 客户端只需要new Thread(new Runnable(){}).start()就开始执行相关的一系列的请求,这些请求大部分都是实现Runnable接口的匿名类。

4.效果
(1).行为型模式;
(2).将调用对象的操作和知道如何实现该操作的对象解耦;
(3).多个命令可以装配成一个复合命令;
(4).增加新的命令很容易。


标签:Runnable,run,target,Thread,--,命令,源码,设计模式,public
From: https://blog.51cto.com/u_10847930/5877231

相关文章

  • golang算法-链表逆序
    前言链表逆序,表述的场景为:A->B->C->D逆序后:D->C>B>A分析需要插入数据,Insert方法需要打印数据,Print方法插入数据时,需要定位最后一个节点,LastNode方法最少需要两个偏移量......
  • golang算法-判断链表是否有环
    前言链表有环,体现为:A->B->C->D->B…分析需要将遍历过的节点存入map,以址为key,空struct为值遍历时,当前节点是否已存在,存在即有环。实现链表//链表的长度,不包过头typeNode......
  • Android设计模式系列(1)--SDK源码之组合模式
    Android设计模式系列(1)–SDK源码之组合模式Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用。在androidUI设计,几乎所有的widget和布局类......
  • 蓝牙实战(二)
    一.概述这是蓝牙实战的第二篇,今天讲讲基本的操作,打开蓝牙可见性,查找设备,显示已绑定设备,先看效果图由于模拟器不支持蓝牙,所以没办法进行相应操作,大家下来可以到真机上测试一......
  • 蓝牙实战(一)
    一.概述在前面的三篇文章讲解蓝牙开发,写的比较详细,篇幅比较长,后面这几篇来点简单实用的,先看效果图二.代码代码如下:BlueToothController控制蓝牙操作publicclassBlueToot......
  • nginx常见问题
    前言本文记载一些nginx常见问题1.connect()fail转发的服务挂了,确保主服务正常运行。可以使用lsof-i:端口号确定被转接的服务的状态2.nginx50X的错误日志去哪看,配置......
  • Android中对Log日志文件的分析(解决ANR)
    一.概述ANR使我们日常开发中偶尔会遇到的一种情况,也就是应用程序无响应,其实在应用出现ANR的时候,系统会在控制台给出错误提示,并且会产生一个相关的日志文件,今天我们就来分析......
  • Android webview实战
    今天来使用webview进行一个实例演练,可以基本用到任何地方,目的在于熟悉一下webview的使用,基本算是入门的吧。先看一下效果图,接下来我们看看如何实现第一步:首先加载网页......
  • Golang常用的工具函数,无依赖,常更
    util.go//Executef()ntimesonfailfuncRetryHandler(nint,ffunc()(bool,error))error{ok,er:=f()ifok&&er==nil{returnnil}ifn-1>0......
  • 从源码的角度探究Activity的启动过程
    一.概述今天我们来搞一下底层一点的东西,大家可能对Activity的生命周期比较熟悉,但是一个Activity是如何启动起来的,你知道吗?今天就来探究一下。二.分析我们先随便写一个demo,然......