[关闭]
@XQF 2017-11-23T18:03:37.000000Z 字数 1687 阅读 943

代理模式

java设计模式-----实验楼


1.概念

代理模式:为另一种对象提供一个替身或者占位符以控制这个对象的访问。

用自己的话说:感觉前面的概念好像是理解的不是很透彻,难道不是太监和皇上的关系吗,就是皇上要做什么的时候太监之前一定要先把准备工作做好,然后实际执行的却是皇上。但是和这个菜鸟教程上说的还是有点差距。
image_1bskm60qo1jcb1l74k7hbke1qq89.png-25kB

这里的意思是我们需要频繁访问一个对象的时候,可以通过访问他的代理类来减少内存资源的占用。反正都是中间商赚差价哈哈。

2.代码实现

代理就是老大的副手,提前完成很多的工作,最后的工作要由老大来完成。

  1. interface Subject {
  2. void make();
  3. }
  4. class RealSubject implements Subject {
  5. @Override
  6. public void make() {
  7. System.out.println("主要来干活的");
  8. }
  9. }
  10. class ProxySubject implements Subject {
  11. private Subject subject;
  12. public ProxySubject(Subject subject) {
  13. this.subject = subject;
  14. }
  15. @Override
  16. public void make() {
  17. prepare();
  18. subject.make();
  19. finish();
  20. }
  21. public void prepare() {
  22. System.out.println("代理正在准备");
  23. }
  24. public void finish() {
  25. System.out.println("代理正在结束");
  26. }
  27. }
  28. public class Main {
  29. public static void main(String[] args) {
  30. Subject subject = new ProxySubject(new RealSubject());
  31. subject.make();
  32. }
  33. }

第二个实例:

image_1bskmrtcd1sag1t0u18dkf7e1d9e9.png-6.1kB

  1. /**
  2. * Created by XQF on 2017/10/17.
  3. */
  4. public interface Image {
  5. void display();
  6. }
  7. /**
  8. * Created by XQF on 2017/10/17.
  9. */
  10. public class RealImage implements Image {
  11. private String filename;
  12. public RealImage(String filename){
  13. this.filename=filename;
  14. }
  15. @Override
  16. public void display() {
  17. System.out.println("displaying "+filename);
  18. }
  19. public void loadFromDisk(String filename){
  20. System.out.println("Loading from "+filename);
  21. }
  22. }
  23. /**
  24. * Created by XQF on 2017/10/17.
  25. */
  26. public class ProxyImage implements Image {
  27. private RealImage realImage;
  28. private String filename;
  29. public ProxyImage(String filename) {
  30. this.filename = filename;
  31. }
  32. @Override
  33. public void display() {
  34. if (realImage == null) {
  35. realImage = new RealImage(filename);
  36. }
  37. realImage.display();
  38. }
  39. }
  40. /**
  41. * Created by XQF on 2017/10/17.
  42. */
  43. public class Demo {
  44. public static void main(String[] args) {
  45. Image image = new ProxyImage("hhe.jpg");
  46. image.display();
  47. System.out.println("");
  48. image.display();
  49. }
  50. }
  51. 第一次加载的时候是从我们的设备里面加载的,然后保留在代理类里面,然后我们的每次后续使用就是使用的这个代理类了而不是再去从存储设备中去加载了。感觉这才是真正的加载代理类
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注