设计模式——代理模式

来源:互联网 发布:pci串行端口 感叹号 编辑:程序博客网 时间:2024/05/21 02:34

场景设置

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(对方电脑)隐藏了它所持有的对象和细节。

0 0
原创粉丝点击