一、概述
1、定义
代理模式:为其他对象提供一种代理,以控制对这个对象的访问。
2、产生的原因
在面向对象系统中,有些对象由于某些原因,比如:对象开销太大、某些操作需要安全控制、或者要访问的对象在远程的机器上,而采用直接访问会给使用者或系统结构带来很多麻烦。
因此,可以在访问此对象时添加一个对此对象的访问层——代理。
简而言之,就是,一个客户不想或者不能直接引用一个对象,此时可以通过”代理”的第三者来实现间接引用,代理对象可以在客户端和目标对象之间起到中介作用,可以通过代理对象来去掉客户不能看到的内容和服务或者添加客户需要的额外服务.
二、常见代理模式
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
- 安全代理,用来控制真实对象访问时的权限。
- 智能指引代理,是指当调用真实对象时,代理处理另外一些事情。
三、代理模式结构图
四、代码示例
1、场景
卓贾易同学想追求李娇娇同学,并送礼物给李娇娇,但是卓贾易不认识娇娇;恰巧卓贾易的朋友戴励同学认识李娇娇同学,于是卓贾易就请求戴励代替其给娇娇送礼物。
2、代码
- SchoolGirls.java
package proxy;
public class SchoolGirls {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- GiveGift.java
package proxy;
public interface GiveGift {
void giveDolls();
void giveFlowers();
void giveChocolate();
}
- Pursuit.java
package proxy;
public class Pursuit implements GiveGift {
private SchoolGirls mm;
public Pursuit(SchoolGirls mm) {
this.mm=mm;
}
@Override
public void giveDolls() {
System.out.println(mm.getName()+"送你洋娃娃");
}
@Override
public void giveFlowers() {
System.out.println(mm.getName()+"送你鲜花");
}
@Override
public void giveChocolate() {
System.out.println(mm.getName()+"送你巧克力");
}
}
- Proxy.java
package proxy;
public class Proxy implements GiveGift {
private Pursuit gg;
public Proxy(SchoolGirls mm) {
this.gg = new Pursuit(mm);
}
@Override
public void giveDolls() {
gg.giveDolls();
}
@Override
public void giveFlowers() {
gg.giveFlowers();
}
@Override
public void giveChocolate() {
gg.giveChocolate();
}
}
- Main.java
package proxy;
public class Main {
public static void main(String[] args) {
SchoolGirls jiaojiao=new SchoolGirls();
jiaojiao.setName("李娇娇");
Proxy daili=new Proxy(jiaojiao);
daili.giveDolls();
daili.giveFlowers();
daili.giveChocolate();
}
}
3、测试结果
李娇娇送你洋娃娃
李娇娇送你鲜花
李娇娇送你巧克力
五、总结
代理模式是一个常用的模式,代理模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度。比如,打开网页中的图片缩略图,远程管理系统都经常使用到代理模式。当我们直接访问一个对象很困难,或者说不能访问,此时只能是找个代理去访问,然后把结果反馈给自己。
参考文章:设计模式之代理模式
在此表示感谢