解决的问题

代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问。

应用场景:

  • 安全代理:屏蔽对真实角色的直接访问。
  • 远程代理:通过代理类处理远程方法调用(RMI)
  • 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象 比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有 100MB,在打开文件时,不可能将所有的图片都显示出来,这样就可以使用代理 模式,当需要查看图片时,用proxy来进行大图片的打开。

    分类 :

  • 静态代理(静态定义代理类)

  • 动态代理(动态生成代理类)

JDK自带的动态代理,需要反射等知识

举例

  1. public class StaticProxyTest {
  2. public static void main(String[] args) {
  3. Proxy s = new Proxy(new RealStar());//传入被代理对象
  4. s.confer();
  5. s.signContract();
  6. s.bookTicket();
  7. s.sing();//通过代理的对象调用被代理类的方法
  8. s.collectMoney();
  9. }
  10. }
  11. interface Star {
  12. void confer();// 面谈
  13. void signContract();// 签合同
  14. void bookTicket();// 订票
  15. void sing();// 唱歌
  16. void collectMoney();// 收钱
  17. }
  18. //被代理类
  19. class RealStar implements Star {
  20. public void confer() {
  21. }
  22. public void signContract() {
  23. }
  24. public void bookTicket() {
  25. }
  26. public void sing() {
  27. System.out.println("明星:歌唱~~~");
  28. }
  29. public void collectMoney() {
  30. }
  31. }
  32. //代理类
  33. class Proxy implements Star {
  34. private Star real;
  35. public Proxy(Star real) {//构造器,通过多态传入被代理对象
  36. this.real = real;
  37. }
  38. public void confer() {
  39. System.out.println("经纪人面谈");
  40. }
  41. public void signContract() {
  42. System.out.println("经纪人签合同");
  43. }
  44. public void bookTicket() {
  45. System.out.println("经纪人订票");
  46. }
  47. public void sing() {
  48. real.sing();//调用被代理类sing方法
  49. }
  50. public void collectMoney() {
  51. System.out.println("经纪人收钱");
  52. }
  53. }