来唠唠Android中模板设计模式的嗑

模板模式恐怕是设计模式中第二容易理解的了,第一就不提了哈哈,


尼玛.jpg

废话不多说,直接来个例子


举个栗子.jpg

模板设计模式就是在一系列算法中将不同的部分抽象出来单独实现相同部分就共用代码。Android源码中也有许多这样的代码,我们熟练应用可以使得编程很方便呢。这里我们用打游戏的例子来说,比如:我打游戏需要开机,关机,这两个是共用的代码,那么登入游戏,退出游戏,玩游戏,是不同的部分,因为我可以玩LOL,也可以是魔兽,那么我们用模板模式套用这个需求。
先准备一个抽象类,为啥是抽象类,因为我们有共同的也有不共同的,那我们用抽象类把不共用的抽象出来是最方便的,比如下面的玩游戏抽象类。
public abstract class PlayGame {
    protected void openComputer(){
        System.out.println("开机");
    };
    abstract protected void loginGame();
    abstract protected void palyGame();
    abstract protected void exitGame();
    protected void closeComputer(){
        System.out.println("关机");
    };
    public final void paly(){
        openComputer();
        loginGame();
        palyGame();
        exitGame();
        closeComputer();
    }
}

中间openComputer、closeComputer都是固定的,那么他可以是不抽象的,这里需要注意的是paly方法里面将需要调用的方法依次调用。他这里写成final,不能重写和覆盖。
然后我们上具体玩游戏的代码,这里我们玩LOL


public class LOLGame extends PlayGame{

    @Override
    protected void loginGame() {
        System.out.println("登入lol");
    }

    @Override
    protected void palyGame() {
        System.out.println("打开lol");
    }

    @Override
    protected void exitGame() {
        System.out.println("退出lol");
    }

}

重写三个不同的方法。因不同游戏代码不同。然后我们在写客户端代码

public class Client {

    public static void main(String args[]){
        PlayGame playGame =new LOLGame();
        playGame.paly();
    }
}

这样客户端不需要懂得玩LOL实现代码有什么不同,他只管玩就行了,不同的代码部分我们也抽出来,方便管理了。在Android源码中AsyncTask就是模板模式,先看源码


image.png

可以看到他是一个抽象类,这很符合我们的游戏抽象类,


image.png

这是我们常用的三个方法,这里只有doInBackground被设置为抽象方法,已用于客户只有处理。自己类结构已经介绍完了,我们整体流程走一遍。先看execute方法,


image.png

他调用了自身的executeOnExecutor返回AsyncTask实例


image.png

可以看到onPreExecute在此掉用,他是最早调用的,仔细看这个mFuture,我们看看他是在哪创建的?一下就来到了构造方法


image.png

mFuture就是FutureTask的实例,如果不懂这个的,就把他理解为开子线程中的Runnable对象一样,他的done就是run。再看里面的mWorke在FutureTask实例化时传入,那么会先走WorkerRunnable的call再走FutureTask的done,在call方法中我们看到了最熟悉的doInBackground


image.png

我们可以看到这个里面有一个publishProgress方法,


image.png

可以看到,doInBackground执行就调用了进度方法,他的消息发送是通过Handle方式,先回到构造方法,我们看FutureTask里面的done方法,调用了postResultIfNotInvoked方法,我们进入。


image.png

如果执行完成,会像handle发送MESSAGE_POST_RESULT,我们搜索MESSAGE_POST_RESULT来到handle实现中
image.png

果然不出所料,他这里出现了onProgressUpdate,执行完毕会走mTask的finish方法,我们进入看看。


image.png

可以看到结束的方法在这个里面,这就是他的整体流程,他将异步控制运用到了极致,仔细阅读会有很大收获的。
总结:AsyncTask中doInBackground、onPreExecute、onPostExecute、onProgressUpdate是四大步骤,doInBackground是必定用于用户实现的,所以一定是抽象的,其余三个可以让用于覆盖也能不覆盖,所以不是抽象的,我们的play就是execute,里面将需要调用的方法安排的明明白白就行。
安排.jpg

你可能感兴趣的:(来唠唠Android中模板设计模式的嗑)