还为那些设计模式烦恼吗-代理模式

代理模式

</br>

介绍

代理模式也称委托模式。何谓代理模式?其实代理在我们日常生活中也并不少见,舍友叫你帮他买外卖也是一种代理 ,碰到辞职老板不发工资,那么请个律师帮你打官司,也是一种代理。总而言之,也许你并不留意,但是代理的确无处不在,现实生活中如此,我们的Code世界也是如此!既然如此,小菜我今天来深看下代理模式到底多普遍。
</br>


定义

为其他对象提供一种代理以控制对这个对象的访问
</br>


使用场景

当无法或者不想直接访问某个对象或者访问某个对象存在困难时可能通过一个代理对象来间接访问,为了保护客户端使用的透明性,委托对象与代理对象需要实现相同的接口
</br>


热身demo

买东西的抽象类:

public abstract class BuyFood {
    /**
     * 一个买的方法
     */
    public abstract void buy();
}

我要买外卖,所以,我要实现上面的抽象类,重写里面的方法:

public class MineBuyFood extends BuyFood {
    /**
     * MineBuyFood中buy的实现具体逻辑
     */
    @Override
    public void buy() {
        System.out.println("我要一份外卖");
    }
}

但是,我没空,比较忙,叫舍友帮我买一份外卖,他就成了代理角色,也要继承上面的抽象类,重写里面的方法:

public class ClassMateBuyFood extends BuyFood {
    //持有MineBuyFood的引用(可以想象成,我把钱给他,他帮我买外卖)
    private MineBuyFood mineBuyFood;

    public ClassMateBuyFood(MineBuyFood mineBuyFood) {
        this.mineBuyFood = mineBuyFood;
    }

    @Override
    public void buy() {
        /**
         * 通过引用mineBuyFood的对象调用
         */
         mineBuyFood.buy();
    }
}

入口类:

/**
 * Created by Jenchar on 2016/7/31.
 */

/**
 * 好比如,首先把我要买外卖这个类new出来,我再给钱我同学的同时,把我同学帮我买外卖这个类new出来,
 * 然后调用方法,即是我同学帮我买外卖这个行为
 *
 * 我买外卖就是一个真实主题类,我同学帮我买外卖就是一个代理类,他的职责就是帮我买外卖。
 */
public class EnterBuyFood {
    public static void main(String[] args) {
        /**
         * 构造一个MineBuyFood对象
         */
        MineBuyFood mineBuyFood=new MineBuyFood();
        /**
         * 构造一个MineBuyFood对象一个ClassMateBuyFood对象
         */
        ClassMateBuyFood classMateBuyFood=new ClassMateBuyFood(mineBuyFood);
        /**
         * 调用ClassMateBuyFood的方法
         */
        classMateBuyFood.buy();

    }
}
输出结果:
我要一份外卖

</br>


红牛,再来一缺罐

小菜我上了好久的班 ,老板就是迟迟不发我工资,我也跟他商议了,但他就是有钱不发给我,我怒了,我要告他。

诉讼接口类:

public interface LawsuitImpl {
    /**
     * 提交申请
     */
    void submit();
    /**
     * 进行举证
     */
    void burden();
    /**
     * 开始辩护
     */
    void defend();
    /**
     * 诉讼完成
     */
    void finish();
}

具体诉讼人,Jenchar:

/**
 * Created by Jenchar on 2016/7/31.
 */
public class Jenchar implements LawsuitImpl {
    @Override
    public void submit() {
        System.out.println("老板欠我工资");
    }

    @Override
    public void burden() {
        System.out.println("这就是证据");
    }

    @Override
    public void defend() {
        System.out.println("证据在这里很明显了,投降吧。");

    }

    @Override
    public void finish() {
        System.out.println("诉讼成功,还我工资了");

    }
}

代理律师类:

/**
 * Created by Jenchar on 2016/7/31.
 */
public class ProxyLawyer implements LawsuitImpl{
    private Jenchar jenchar;

    public ProxyLawyer(Jenchar jenchar) {
        this.jenchar = jenchar;
    }

    @Override
    public void submit() {
        jenchar.submit();
    }

    @Override
    public void burden() {
        jenchar.burden();
    }

    @Override
    public void defend() {
        jenchar.defend();
    }

    @Override
    public void finish() {
        jenchar.finish();
    }
}

法庭类:

/**
 * Created by Jenchar on 2016/7/31.
 */
public class Client {
    public static void main(String[] args) {
        //构造我自己Jenchar
        Jenchar jenchar=new Jenchar();
        ProxyLawyer proxyLawyer=new ProxyLawyer(jenchar);
        //律师帮我提交申请
        proxyLawyer.submit();
        //律师帮我进行举证
        proxyLawyer.burden();
        //律师帮我进行辩护
        proxyLawyer.defend();
        //律师完成我的诉讼
        proxyLawyer.finish();
    }
}
输出结果:
老板欠我工资
这就是证据
证据在这里很明显了,投降吧。
诉讼成功,还我工资了

</br>


小分析

讲了这么多,上面就说了代理模式的一半,因为代理模式,分为静态代理,动态代理,上面讲得就是静态代理。
看看上面的代码,想一下,上面的充当代理角色的有,小菜我舍友,小菜聘请的律师,其实,我舍友会帮更多的人买外卖,律师被更多的人聘请来打官司,而具体到底是代表哪个人,这就要看代理类中所持有的实际对象(上面就demo,在代理类中持有的真实对象是ClassMate,还有Jenchar),这样,我们引进了一个动态代理,而它不知道要为谁代理。Java给我们提供一个动态代理接口,这个接口名,要死记硬背的,它的名字就是InvocationHandler,里面有一个方法名pulbic Object invoike(Object arg,Method arg1,Object[] arg2),实现该借口并重写该方法就行了,讲这么多,我们来看下Demo
</br>


动态代理

上面的demo就改两个类,一个法庭类,一个代理律师类

代理律师类:

public class ProxyLawyer implements InvocationHandler{
    //因为不知道代理谁,所以把他声明一个Object对象
    private Object object;
    public ProxyLawyer(Object object) {
        this.object = object;
    }

    /**
     * 实现该方法,实现动态代理的前戏
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=method.invoke(object,args);
        return result;
    }
}

法庭类:

public class Client {
    public static void main(String[] args) {
        //构造我自己Jenchar
        Jenchar jenchar=new Jenchar();
        //构造一个动态代理
        ProxyLawyer proxyLawyer=new ProxyLawyer(jenchar);
        //获取被代理类Jenchar的ClassLoader
        ClassLoader loader=jenchar.getClass().getClassLoader();
        //动态构造一个代理律师
        LawsuitImpl lawsuit=(LawsuitImpl) Proxy.newProxyInstance(loader,new Class[]{LawsuitImpl.class},proxyLawyer);
        //律师帮我提交申请
        lawsuit.submit();
        //律师帮我进行举证
        lawsuit.burden();
        //律师帮我进行辩护
        lawsuit.defend();
        //律师完成我的诉讼
        lawsuit.finish();
    }
}

小传送门:classloader
</br>


小结

静态代理与动态代理,其实,个人觉得比较倾向动态代理,代码解耦,根据不需要考虑去代理谁,高端大气上档次,不过,静态代理比较符合OOP。但是,我还是比较货币动态代理。
</br>


喜欢我的朋友,可以与我一起讨论问题,我也是学习者,希望与大学一起学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容