zoukankan      html  css  js  c++  java
  • Android设计模式系列(7)SDK源码之命令模式

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

    1.意图
    将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
    热门词汇:动作 事物 请求封装 排队 打包 异步 

    2.结构


    Command接口提供了Execute方法,客户端通过Invoker调用命令操作来调用Recriver,绕了一大圈,但是却把具体对Receiver的操作请求封装在具体的命令中,是客户端对recriver的操作清晰简明。
    但是在实际项目中,我们常常忽略Receiver,而把命令对象的目标对象直接设置为子类自己的成员变量或者作为execute()方法的临时变量。
    以Android中的Runnable(在java.lang包下)为例,我们画出UML结构图如下:


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

    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).增加新的命令很容易。

  • 相关阅读:
    codeforces-1328F-Make k Equal
    codeforces-1327C-Game with Chips
    codeforces-1328E-Tree Queries
    深度学习(九):变分自编码器
    深度学习(八):概率生成模型
    深度学习(六):吉布斯采样
    深度学习(五):M-H采样
    深度学习(四):马尔科夫链蒙特卡洛采样(MCMC)
    深度学习(二):图模型的学习
    深度学习(一):概率图模型引入
  • 原文地址:https://www.cnblogs.com/qianxudetianxia/p/2135478.html
Copyright © 2011-2022 走看看