代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.
代理模式在现实生活中的例子非常常见。
我们很多人都追星,喜欢送礼物给明星,但是实际上我们送出去的礼物大多数不是直接送到明星手里的,而是通过他们的经纪人。
这里的经纪人就是典型的代理对象。
下面通过一个粉丝送礼物的例子来说明一下代理模式。
首先是粉丝类,粉丝这个类里面定义了一个方法,sendGift。
package com.proxy; public class Fans { public String sendGift(String gift){ System.out.println("send " + gift +" to my idol!"); return gift; } }
然后定义一个接受礼物的接口
package com.proxy; public interface AcceptGift { /** * 接受礼物 * @param gift */ public void accept(String gift); }
之后定义明星类,明星类实现AcceptGift的接口,可以接受礼物。
package com.proxy; public class Idol implements AcceptGift{ @Override public void accept(String gift) { // TODO Auto-generated method stub System.out.println("Idol say : I accept " + gift); } }
最后定义经纪人类,同样实现AcceptGift的接口,可以接受礼物。
package com.proxy; public class Agent implements AcceptGift{ Idol idol; public Agent() { // TODO Auto-generated constructor stub idol = new Idol(); } @Override public void accept(String gift) { // TODO Auto-generated method stub if(gift.equals("danger")){ //检查礼物是否安全 System.out.println("Agent say : gift is danger!"); } else{ idol.accept(gift); } } }
在这个代理类里面,经纪人首先会检查礼物是否安全,如果礼物不安全,会发出警告,不会将礼物转交给明星,
如果礼物是安全的,则转交给明星。
现在可以测试一下
package com.test; import com.proxy.Agent; import com.proxy.Fans; public class Test { public static void main(String[] args){ Fans fans0 = new Fans(); String gift0 = fans0.sendGift("flower"); //粉丝0送花 Fans fans1 = new Fans(); String gift1 = fans1.sendGift("danger"); //粉丝1送危险物品 System.out.println(); Agent agent = new Agent(); agent.accept(gift0); //经纪人接受礼物转送给明星 agent.accept(gift1); //经纪人接受礼物转送给明星 } }
输出结果如下:
通过代理类,粉丝将礼物送到了明星手里,同时经纪人对礼物的检查也避免了一些不安全的事件(这也是代理模式的应用场景之一——安全代理)。
代理模式的应用场景主要有:
1、远程代理 这个就比如粉丝在A地遇到经纪人,将礼物给了经纪人,经纪人将礼物快递到B地的明星
2、虚拟代理:根据需要创建开销很大的对象,通过它来实例化需要很长时间的真实对象。
这个好比粉丝见面会,明星耍大牌,姗姗来迟。
经纪人这个时候就需要一面安抚粉丝,告诉粉丝:“xxx马上来了,稍安勿躁”,一面安排车辆接明星,并催明星:“xxx,快过来,不然你就掉粉了!”
3、安全代理
4、智能代理:是指调用真实对象时,代理处理另外一些事。
这个好比,经纪人转发礼物给明星的时候,顺便告诉他,送这个礼物的粉丝是某某某权贵的女儿,好好处理关系。
看多了八卦还是有用的啊= =