码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式——代理模式

时间:2015-03-08 13:03:47      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:设计模式   代理模式   

场景设置

Boy 有一束鲜花要送给 Girl,但是又不好意思送,因此寻找Proxy将鲜花转交给Girl。

首先定义鲜花持有者接口,实现该接口的类都具有送花的能力:

interface FlowerKeeper{
    public void sendFlower();
}

然后定义Boy类,能够拥有鲜花并且有送鲜花的能力(只是不亲自送而已):

class Boy implements FlowerKeeper{
    private String flowerName;
    Boy(String flower){
        this.flowerName = flower;
    }
    @Override
    public void sendFlower() {
        System.out.println("I give you this flower");
    }
}

接下来Boy要寻找一个Proxy,这个Proxy同样要能够有鲜花(从Boy那里拿到的)而且拥有送花的能力:

class Proxy implements FlowerKeeper{
    private FlowerKeeper boy = null;
    Proxy(){
        if(boy==null)
            boy = new Boy("郁金香");
    }
    @Override
    public void sendFlower() {
        System.out.println("The Boy said: ");
        boy.sendFlower();
    }
}

最后,这个Proxy代表着Boy,调用自己的sendFlower 方法将鲜花转交给了Girl(该类就不在此定义了,具体在FlowerKeeper 的interface中可能持有对Girl进行表白等等的方法)。
在客户端中可以如下操作:

public static void main(String[] args){
    FlowerKeeper proxyFlowerKeeper = new Proxy();
    proxyFlowerKeeper.sendFlower();
}

为了清楚起见,我将Proxy的对象名定义成为proxyFlowerKeeper,如果为了从表象上达到代理的真实目的(隐藏内部),那么可以这么写:

public static void main(String[] args){
    FlowerKeeper boy = new Proxy();
    boy.sendFlower();
}

如果在客户端上面还有一层的话,new Proxy(); 的细节可以不被暴露,则外界也无从得知到底这个boy是Proxy还是真的是Boy本身。

代理模式适用情况

代理模式的使用,是为了“代理”它内部所持有的某个对象的行为,可能在该原始行为的基础上增加一些附加行为而同时在上层看来,调用这两种行为方法是没有差别的。类似于

在互联网中,没人知道你是一条狗。

电脑代理了一只狗的键盘操作行为,只要它键盘按对了,打出的字根人打出的字是无法区分的,因此在网络那头看来,Proxy(对方电脑)隐藏了它所持有的对象和细节。

设计模式——代理模式

标签:设计模式   代理模式   

原文地址:http://blog.csdn.net/langduhualangdu/article/details/44131935

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!