一.场景
“娇娇同学,这是有人送你的礼物”,一个男生拿着一束花
“戴笠同学,这是什么意思”娇娇看着这个同班的男同学
“是这样的,我的朋友隔壁三班卓一航,让我代送个礼物”,戴笠有点脸红
“为什么要送我礼物,我不认识他啊”
“他说..他说想和你交个朋友”,戴笠抓抓后脑勺,说话吞吞吐吐。
“不用这样的,我不需要礼物”娇娇显然想拒绝
“别别别,他是我好朋友,他拜托我送你礼物也是下了很大决心的,你看我平常给你讲数学题的份上,就收下吧”戴笠有些着急
“那好吧,今天我对椭圆几何解析还不太懂,你再帮我讲讲”娇娇提出条件后接下礼物
“没问题”戴笠松了口气
...
几天后
“娇娇,这是卓一航送你的花”
...
“娇娇,这是卓一航送你的巧克力”
“我不想要他的礼物了,我不想和他做朋友,我想...我想和你做朋友!”娇娇说
“啊...我不是在做梦吧!”喜从天降,戴笠不敢相信...
“其实我也很喜欢ni....”戴笠抓抓头
从此娇娇和戴笠恋爱了。
“咚!”黑板擦飞过来
数学老师:“上我的课还敢睡觉!”
是不是很狗血,卓一航是为别人做嫁衣,自己不主动,让别人代理谈恋爱
二.静态代理
1.实现
送礼物接口
public interface GiveGift {
public void giveFlowers();
public void giveChocolate();
public void giveDolls();
}
追求者类
package Proxy;
public class Pursuit implements GiveGift{
SchoolGirl girl ;
String name;
@Override
public void giveFlowers() {
System.out.println(girl.getName()+"送你花");
}
@Override
public void giveChocolate() {
System.out.println(girl.getName()+"送你巧克力");
}
@Override
public void giveDolls() {
System.out.println(girl.getName()+"送你娃娃");
}
public Pursuit(SchoolGirl girl, String name) {
super();
this.girl = girl;
this.name = name;
}
}
代理类
package Proxy;
public class Proxy implements GiveGift {
private String name;
Pursuit pursuit;
@Override
public void giveFlowers() {
System.out.print("戴笠:");
pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
System.out.print("戴笠:");
pursuit.giveChocolate();
}
@Override
public void giveDolls() {
System.out.print("戴笠:");
pursuit.giveDolls();
}
public Proxy(String name, Pursuit pursuit) {
super();
this.name = name;
this.pursuit = pursuit;
}
}
女孩
package Proxy;
public class SchoolGirl {
private String name;
public SchoolGirl(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
客户端
public static void main(String[] args) {
SchoolGirl girl = new SchoolGirl("娇娇");
Pursuit pursuit = new Pursuit(girl, "卓一航");
Proxy proxy = new Proxy("戴笠", pursuit);
proxy.giveFlowers();
proxy.giveChocolate();
proxy.giveDolls();
}
女孩不认识追求者,却通过代理拿到了礼物
2.使用场景
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。