先给出一个情景:A通过B追C
我们要考虑的
代理模式UML图
为其他对象提供一种代理以控制对对象的访问

针对模式原型的代码实现
请求抽象接口
1 2 3
| public interface Subject { public void request(); }
|
具体请求对象
1 2 3 4 5 6
| public class RealSubject implements Subject { @Override public void request() { System.out.println("真实的请求"); } }
|
代理类
1 2 3 4 5 6 7 8 9 10
| public class Proxy implements Subject { RealSubject realSubject; @Override public void request() { if (realSubject == null) { realSubject = new RealSubject(); } realSubject.request(); } }
|
客户端
1 2 3 4
| public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.request(); }
|
针对情景的代码实现
送礼物抽象接口
1 2 3 4 5
| public interface GiveGift { void giveDolls(); void giveFlower(); void giveChocolate(); }
|
追求类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Pursuit implements GiveGift { String girl;
public Pursuit(String girl) { this.girl = girl; } @Override public void giveDolls() { System.out.println(girl + ",送你洋娃娃"); }
@Override public void giveFlower() { System.out.println(girl + ",送你花花"); }
@Override public void giveChocolate() { System.out.println(girl + ",送你巧克力"); } }
|
代理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class Proxy implements GiveGift { private Pursuit gg; private String girl;
public Proxy(String girl) { this.girl = girl; this.gg = new Pursuit(girl); }
@Override public void giveDolls() { gg.giveDolls(); }
@Override public void giveFlower() { gg.giveFlower(); }
@Override public void giveChocolate() { gg.giveChocolate(); } }
|
客户端
1 2 3 4 5 6
| public static void main(String[] args) { String girl = "xyy"; Proxy_Persue.Proxy a = new Proxy_Persue.Proxy(girl); a.giveChocolate(); a.giveChocolate(); }
|
代理模式的应用
- 远程代理
为一个对象在不同地址空间提供局部代表,隐藏对象存在于不同地址空间的事实
- 虚拟代理
根据需要创建开销很大的对象。通过来存放是俩话需要很长时间的真实对象
- 安全代理
控制真实对象访问权限。
- 智能指引
当调用真实对象时,代理处理另外一些事
本文部分内容改编于程杰老师的《大话设计模式》