美文网首页
代理模式在Android中的应用

代理模式在Android中的应用

作者: 三眼卡夫卡a | 来源:发表于2020-02-27 15:02 被阅读0次

    一 什么是代理模式

    关于 设计模式

    设计模式是人们在解决软件开发过程中总结出来的智慧结晶。代理模式也是一种解决实际问题的技巧。

    在讲概念之前,我们来讲讲明代的首辅制度。因为首辅制度也是一种解决实际问题的技巧。

    我们现在来到明朝的嘉靖年间。

    假设你是帝国的皇帝,面对着整个大明帝国四千万户,接近两亿的人口。两万多名职业官僚。无数 边防卫戍,治安管理,经济发展,粮食收割,甚至环境保护,都需要你来管理。

    要管理好这么多的人,可不是一件容易的差事儿,如果管理不好可能就会出现大问题。

    于是,帝国的最高领导人想出了一个好办法,抽象出来了六部的概念,

    户部 主管财政。

    兵部 主管边防

    刑部 主管司法

    礼部 主管礼教

    吏部 主管人事

    工部 主管建设

    好的,事情完美解决。作为皇帝的你,就可以安心回宫,享受人生了。

    然而事情并没有这么美好。因为你发现跟 户部尚书,刑部侍郎 一起交涉的过程依然很痛苦。

    每个部门都有其业务特征和处事风格。而且每个充任尚书的人未必能合你的胃口。

    每天都要处理无数的琐事。根据史书记载,朱元璋每天要批阅2000本奏章。朱元璋搞得定,但他的后代就扛不住了,逐渐让亲近的大臣等充任大学士,并提升其地位提升了起来,让他们组成了内阁。明朝中后期以后,皇帝有啥事儿,都跟内阁大学士商量。然后再让大学士去管理六部。

    好的,事情完美解决。作为皇帝的你,就可以安心回宫,享受人生了。

    镜头一晃,恭喜你来到了21世纪。现在的你是一个互联网app开发人员,要去独立开发一个Android App,这个app有三十多个功能,二百多个界面。

    无数网络获取,数据储存,界面展示,颜色色值。都要你来处理。

    要你来自己写,那可就要累死了,不过感谢互联网和开源世界,你想出了一个好办法,抽象出来六个第三方的功能框架

    GreenDao 负责数据持久

    OKHttp 负责网络数据交互

    picasso 负责图片加载

    RXJava 负责业务流程设计

    margin design 负责界面展示

    JCE 负责数据加密

    好的,事情完美解决。作为工程师的你,就可以安心写写代码,聊聊妹子。享受人生了。

    然而事情并没有这么美好。你发现在使用GreenDao,Picasso的过程中总是会遇到这样那样的问题。第三方框架虽然好用,但是真正使用起来没有那么简单。每个框架都有其学习成本,以及与业务代码不贴切的地方。

    于是你抽象出来了大学士这个概念,基于你们公司的移动业务,在六部尚书等第三方框架基础上搭建了属于你自己的业务框架。

    好的,事情完美解决。作为皇帝的你,就可以安心回宫,享受人生了。

    二 代理模式有什么好处

    1 减少工作量,提高工作效率

    本来嘉靖皇帝每天要处理200本奏章,1000件国家大事。自从有了内阁大学士们。每天只要看看他们形成的意见(意见)。 发表一下自己的关键意见。 轻松轻松就解决了众多问题

    本来你要写三十个功能,200个界面。自动有了业务框架们。每天只要稍稍使用自己的框架,几行代码就可以实现很多高质量的功能。

    2 提高可跨拓展性。

    在没有大学士之前,如果有一天刑部尚书张大人得了病,告老还乡。 皇帝陛下,很痛苦,需要去考察,去磨合一位新的下属。 再次期间,整个国家的司法必然受到一定程度的影响、

    现在有了大学士。可能前脚张大人刚打了个喷嚏,后脚内阁首辅严嵩,和内阁次辅徐阶。 立刻就把他们各自手下的门生推荐上来了。而且还强烈建议为了张大人的人生健康和祖国的司法事业不受影响,应该迅速更换。

    在没有代理层之前,如果有一天 piasso突然暴出来出现了一个惊天大Bug。这个app都面临这个无法正常使用,甚至泄露用户信息的风险。 你一定很痛苦,因为你要去做无数的事情,去维护这个app的正常业务.

    现在有了ImageSource的业务代理框架。前脚picasso出了大问题,你只需要半天的时间修改为fecso.

    你团队里负责开发业务代码的人员,根本不会发现这件事情。对于他们来说ImageSource依然很好用。没有任何改变。

    3 贴近业务,提高整体性能。

    内阁大学士比第三方框架更贴心,比自己动手实现更有才华,毕竟适合的才是更好的。。

    Picasso不会加载空url. 下拉刷新组件会有更符合整体风格的footview和 headview文案以及设计。

    网络加载需要,需要延迟,需要重试。界面框架更省电,更省流量、

    而这些东西,对于业务框架的使用者来说,完全是天生的。对于app来说无疑大大提升了性能。

    三 适用场景

    首先是需要一定的复杂度。 管理一个村子是用不到内阁大学士的。甚至连六部尚书都不需要。自己撸起袖子加油干就是了。

    第二是 必须有可见的好处。因为代理实际上是要增加一层流程,对效率产生负面影响。

    就好像房产中介,他是肯定要从中间抽一层中介费的。

    因此具体到使用代理模式的场景,一定要有其意义。

    就像房产中介这个代理,如果拿掉其实也不会有太多的差别,反而节省了开支。

    最后是一个简单的代理模式实现

    package com.dqqdo.testclass;

    /**

    * Created by qingquan on 2017/6/29.

    */

    public class ProxyMain {

        public static void main(String args[]){

            King king = new King("嘉靖皇帝");

            System.out.println("--" + king.getName() + "- 要管理国家事务了。 ----");

            Official yansong = new Official("严嵩",false);

            Official xujie = new Official("徐阶",true);

            System.out.println("-----" + king.getName() + " 选择严嵩作为他的首辅。 ----");

            king.setPremier(yansong);

            if(king.isWorkDone()){

                System.out.println("国家治理的很好,皇帝很开心");

            }else{

                System.out.println("国家治理的不好,皇帝很生气");

            }

            System.out.println("-----" + king.getName() + " 选择徐阶作为他的首辅。 ----");

            king.setPremier(xujie);

            if(king.isWorkDone()){

                System.out.println("国家治理的很好,皇帝很开心");

            }else{

                System.out.println("国家治理的不好,皇帝很生气");

            }

        }

        /**

        * 首辅接口

        */

        interface Premier{

            boolean doWork();

        }

        /**

        * 官员类 实现首辅接口

        */

        static class Official implements Premier{

            private String name;

            private boolean isGoodGuy;

            public Official(String name,boolean isGoodGuy){

                this.name = name;

                this.isGoodGuy = isGoodGuy;

            }

            @Override

            public boolean doWork() {

                System.out.println(name + "在做具体的工作");

                return isGoodGuy;

            }

        }

        /**

        * 皇帝类

        */

        static class King{

            private Premier premier;

            private String name;

            public King(String name) {

                this.name = name;

            }

            public Premier getPremier() {

                return premier;

            }

            public void setPremier(Premier premier) {

                this.premier = premier;

            }

            public String getName() {

                return name;

            }

            public void setName(String name) {

                this.name = name;

            }

            public boolean isWorkDone(){

              return premier.doWork();

            }

        }

    }

    相关文章

      网友评论

          本文标题:代理模式在Android中的应用

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