模式说明

客户端不直接声明真实主题,而是声明代理类,通过调用代理类的方法来间接执行真实主题类的行为。

本示例中以代理售房为例,房东需要告知购房者房子类型和价格,但不直接告知购房者,而是通过代理来完成告知动作。代理类中持有房东实例,客户端只声明代理类,调用代理类实例中与房东类相同的方法来完成。房东类和代理类都是目标接口实现类,实现相同的抽象方法,代理类实现该抽象方法的方式是调用其持有的房东类的方法。

结构

抽象主题类
定义真实主题的方法。
具体主题类
继承抽象类,实现抽象方法。
代理类
内部持有一个具体主题类的实例,通过调用该具体主题实例的方法来实现抽象主题类的抽象方法。

代码演示

  1. package com.yukiyama.pattern.structure;
  2. /**
  3. * 代理模式
  4. */
  5. public class ProxyDemo {
  6. public static void main(String[] args) {
  7. // 声明一个房屋代理类
  8. HouseAgent agent = new HouseAgent();
  9. // 调用代理类的方法
  10. // 输出“三室一厅”
  11. agent.showHouse();
  12. // 输出“100万”
  13. agent.negotiatePrice();
  14. }
  15. }
  16. /**
  17. * 抽象主题类
  18. * 下例为抽象房东类,有抽象展示房屋方法和抽象价格交涉方法。
  19. */
  20. abstract class Subject{
  21. public abstract void showHouse();
  22. public abstract void negotiatePrice();
  23. }
  24. /**
  25. * 具体主题类
  26. * 继承抽象主题类,实现抽象方法。
  27. * 下例为房东类。
  28. */
  29. class HouseHolder extends Subject{
  30. private String house;
  31. private int price;
  32. @Override
  33. public void showHouse() {
  34. house = "三室一厅";
  35. System.out.println(house);
  36. }
  37. @Override
  38. public void negotiatePrice() {
  39. price = 100;
  40. System.out.println(price + "万");
  41. }
  42. }
  43. /**
  44. * 代理类
  45. * 持有一个具体主题类实例(房东),实现接口抽象方法,在内部调用真实主题的方法。
  46. */
  47. class HouseAgent extends Subject{
  48. HouseHolder holder = new HouseHolder();
  49. @Override
  50. public void showHouse() {
  51. holder.showHouse();
  52. }
  53. @Override
  54. public void negotiatePrice() {
  55. holder.negotiatePrice();
  56. }
  57. }