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