代理模式在Android中的应用


一 什么是代理模式

关于 设计模式

设计模式是人们在解决软件开发过程中总结出来的智慧结晶。代理模式也是一种解决实际问题的技巧。
在讲概念之前,我们来讲讲明代的首辅制度。因为首辅制度也是一种解决实际问题的技巧。

我们现在来到明朝的嘉靖年间。
假设你是帝国的皇帝,面对着整个大明帝国四千万户,接近两亿的人口。两万多名职业官僚。无数 边防卫戍,治安管理,经济发展,粮食收割,甚至环境保护,都需要你来管理。
要管理好这么多的人,可不是一件容易的差事儿,如果管理不好可能就会出现大问题。

于是,帝国的最高领导人想出了一个好办法,抽象出来了六部的概念,
户部 主管财政。
兵部 主管边防
刑部 主管司法
礼部 主管礼教
吏部 主管人事
工部 主管建设

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

然而事情并没有这么美好。因为你发现跟 户部尚书,刑部侍郎 一起交涉的过程依然很痛苦。
每个部门都有其业务特征和处事风格。而且每个充任尚书的人未必能合你的胃口。
每天都要处理无数的琐事。根据史书记载,朱元璋每天要批阅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();

        }



    }


}







评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值