静态代理模式
概念:为其他对象提供一种代理以控制对这个对象的访问。
代理模式(Proxy)结构图 ——————图片选自大话设计
代码实现:
创建送礼物接口:
/**
* @ author 黄栋
* @ create 2021/10/20
*/
public interface IGiveGift {
//送洋娃娃
void giveDolls();
//送鲜花
void giveFlowers();
//送巧克力
void giveChocolate();
}
//创建目标对象:——User目标角色
/**
* @ author 黄栋
* @ create 2021/10/20
*/
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
创建追求者:——真实角色
/**
* @ author 黄栋
* @ create 2021/10/20
*/
public class Pursuit implements IGiveGift{
private User user;
public Pursuit(User user) {
this.user = user;
}
@Override
public void giveDolls() {
System.out.println(user.getName()+"送你洋娃娃。");
}
@Override
public void giveFlowers() {
System.out.println(user.getName()+"送你鲜花。");
}
@Override
public void giveChocolate() {
System.out.println(user.getName()+"送你巧克力。");
}
}
创建代理角色:
/**
* @ author 黄栋
* @ create 2021/10/20
*/
public class Proxy implements IGiveGift{
//引用真是角色
private Pursuit pursuit;
public Proxy(Pursuit pursuit) {
this.pursuit = pursuit;
}
@Override
public void giveDolls() {
pursuit.giveDolls();
}
@Override
public void giveFlowers() {
pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
pursuit.giveChocolate();
}
}
测试类:
/**
* @ author 黄栋
* @ create 2021/10/20
*/
public class Test {
public static void main(String[] args) {
User user = new User();
user.setName("大熊");
Pursuit pursuit=new Pursuit(user);
Proxy proxy=new Proxy(pursuit);
proxy.giveChocolate();
}
}
运行结果:
大熊送你巧克力。
代理模式应用的场合:
第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
第二种应用是虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
这样就可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,但你还是可以很快打开它,此时你所看到的是所有的文字,但图片却是一张一张地下载后才能看到。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。
第三种应用是安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
第四种是智能指引,是指当调用真实的对象时,代理处理另外一些事。