美文网首页
来唠唠Android中模板设计模式的嗑

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

作者: 坑逼的严 | 来源:发表于2019-04-22 18:19 被阅读0次

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


尼玛.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中模板设计模式的嗑

    模板模式恐怕是设计模式中第二容易理解的了,第一就不提了哈哈, 废话不多说,直接来个例子 中间openCompute...

  • 来唠唠Android中代理设计模式的嗑

    代理分为静态代理和动态代理,静态代理不需要借助jdk或其他三方力量,自己多写一个代理类解决。动态代理有两种一是jd...

  • 来唠唠Java中建造者模式的嗑

    在Android23种设计模式中,前几章就是建造者模式,可以看出他的简单性与重要性,往往简单常用的设计模式作者才会...

  • 唠唠社会嗑

    一个社会大佬邻居伯伯返乡过年在我家喝茶聊天,很晚才走。这种场合下少不了的环节就是吹牛,听他吹完他遍布祖国各地的亲朋...

  • 嗑唠

    冬天来到了长沙,虽然没有下雪,但是街上随处可见穿羽绒服的行人。天冷的时候,看着匆匆行人,自己竟有一丝落寞的感觉。老...

  • 唠 嗑

    本应该今天截止的java阶段,老师又给我们推迟了一周,不然今天可能就是我坐在小组的最后一天了。 从java开始阶段...

  • 唠闲磕

    生活工作中总会遇到喜欢唠闲磕的人,不但喜欢哪里都来唠上一唠,关键是不看气氛瞎唠,大度的会觉得唠闲嗑的傻,小气的直接...

  • [设计模式]唠唠依赖注入

    啥是依赖注入(Dependency injection)? 直接上例子: 这不是依赖注入! 这就是依赖注入 这也是...

  • 唠会儿嗑

    好久没写文章了,简书最近风波也挺大的,刚好为我不写文章找了个好借口 ,那件事,我也大概了解了,但是我也不想做任...

  • 唠会嗑

    今早醒来特别早,看了时间刚好5点,巴拉开窗帘,外面是乌漆嘛黑的一片,只是在窗台旁的木瓜树叶子又长大了不少,挡住了窗...

网友评论

      本文标题:来唠唠Android中模板设计模式的嗑

      本文链接:https://www.haomeiwen.com/subject/txrugqtx.html