(静态)代理模式
-
介绍a
- 结构图:
- 结构图:
- 定义
代理模式为其他对象提供一种代理以控制对这个对象的访问
- (自我总结)核心:
- 顶层方法接口
- 代理对象类
- 实际对象类
-
特点:
在保留一个类的基本功能的同时,可以通过代理方式对其方法进行增强,起到职责分明
和功能加强
的作用 -
使用场景(
这种思想不仅仅运用于代码中
)- 远程代理,为一个对象在不同的地址空间起到局部代表,这样可以隐藏一个对象存在于不同地址空间的事实
- 虚拟代理,比如各种占位情况(图片的预加载占位等等)
- 安全代理,比较常用,在真正功能调用前进行安全验证
- 功能拓展,比如日志输出、打印、字符串修改等等
采用《大话设计模式》的实例
TheReal通过TheProxy给Girl送礼物的过程
一、结构图
结合图和下面的代码,我们发现每次调用Proxy的方法,其实正在完成功能的是TheReal对象
广义上看TheProxy就仅仅就是调用TheReal,但是因此我们可以调用前后添加自己的代码,起到各种各样的附加功能
二、代码
// 调用方 不属于工厂结构内部
public class ProxyPatternMain {
public static void main(String[] args) {
Girl girl = new Girl("女孩纸");
TheReal theReal = new TheReal("单身狗", girl);
TheProxy theProxy = new TheProxy(theReal);
// 这个girl是在TheReal还是在TheProxy中视功能而定,甚至完全可以不需要
theProxy.sentChocolate();
theProxy.sentFlower();
theProxy.sentSnacks();
}
}
// ISentGift的接口
public interface ISentGift {
void sentFlower();
void sentChocolate();
void sentSnacks();
}
// 代理类
public class TheProxy implements ISentGift{
TheReal theReal;
public TheProxy(TheReal theReal) {
this.theReal = theReal;
}
@Override
public void sentFlower() {
//可以拓展
this.theReal.sentFlower();
//可以拓展
}
@Override
public void sentChocolate() {
//可以拓展
this.theReal.sentChocolate();
//可以拓展
}
@Override
public void sentSnacks() {
//可以拓展
this.theReal.sentSnacks();
//可以拓展
}
}
// 实际执行类
public class TheReal implements ISentGift {
String name;
Girl girl;
public TheReal(String name, Girl girl) {
this.name = name;
this.girl = girl;
}
@Override
public void sentFlower() {
System.out.println(this.name+ "送花给" +this.girl.name);
}
@Override
public void sentChocolate() {
System.out.println(this.name+ "送巧克力给" +this.girl.name);
}
@Override
public void sentSnacks() {
System.out.println(this.name+ "送零食给" +this.girl.name);
}
}
// 女孩类
public class Girl {
String name;
public Girl(String name) {
this.name = name;
}
}