From 3a86098be5cf274ce7bba8db4fedd0328495ae9c Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 5 Jun 2018 21:33:34 +0800 Subject: [PATCH] auto commit --- notes/设计模式.md | 96 +++++++++++++++++- pics/a6c20f60-5eba-427d-9413-352ada4b40fe.png | Bin 0 -> 16384 bytes 2 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 pics/a6c20f60-5eba-427d-9413-352ada4b40fe.png diff --git a/notes/设计模式.md b/notes/设计模式.md index 278d6c9a..c863894d 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -2885,9 +2885,101 @@ Java 利用缓存来加速大量小对象的访问时间。 ### 意图 -提供一个占位符来控制对象的访问。 +控制对其它对象的方法。 -代理可以是一些轻量级的对象,它控制着对重量级对象的访问,只有在真正实例化这些重量级对象时才会去实例化它。 + +### 类图 + +代理有以下四类: + +- 远程代理(Remote Proxy):控制对远程对象(不同地址空间)的访问,它负责将请求及其参数进行编码,并向不同地址空间中的对象发送已经编码的请求。 +- 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象,它可以缓存实体的附加信息,以便延迟对它的访问,例如在网站加载一个很大图片时,不能马上完成,可以用虚拟代理缓存图片的大小信息,然后生成一张临时图片代替原始图片。 +- 保护代理(Protection Proxy):按权限控制对象的访问,它负责检查调用者是否具有实现一个请求所必须的访问权限。 +- 智能代理(Smart Reference:取代了简单的指针,它在访问对象时执行一些附加操作:记录对象的引用次数,比如智能智能;当第一次引用一个持久化对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其它对象不能改变它。 + +

+ +### 实现 + +以下是一个虚拟代理的实现,模拟了图片延迟加载的情况下使用与图片大小相等的临时内容去替换原始图片,直到图片加载完成才将图片显示出来。 + +```java +public interface Image { + void showImage(); +} +``` + +```java +public class HighResolutionImage implements Image { + + private URL imageURL; + private long startTime; + private int height; + private int width; + + public int getHeight() { + return height; + } + + public int getWidth() { + return width; + } + + public HighResolutionImage(URL imageURL) { + this.imageURL = imageURL; + this.startTime = System.currentTimeMillis(); + this.width = 600; + this.height = 600; + } + + public boolean isLoad() { + // 模拟图片加载,延迟 3s 加载完成 + long endTime = System.currentTimeMillis(); + return endTime - startTime > 3000; + } + + @Override + public void showImage() { + System.out.println("Real Image: " + imageURL); + } +} +``` + +```java +public class ImageProxy implements Image { + private HighResolutionImage highResolutionImage; + + public ImageProxy(HighResolutionImage highResolutionImage) { + this.highResolutionImage = highResolutionImage; + } + + @Override + public void showImage() { + while (!highResolutionImage.isLoad()) { + try { + System.out.println("Temp Image: " + highResolutionImage.getWidth() + " " + highResolutionImage.getHeight()); + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + highResolutionImage.showImage(); + } + +} +``` + +```java +public class ImageViewer { + public static void main(String[] args) throws Exception { + String image = "http://image.jpg"; + URL url = new URL(image); + HighResolutionImage highResolutionImage = new HighResolutionImage(url); + ImageProxy imageProxy = new ImageProxy(highResolutionImage); + imageProxy.showImage(); + } +} +``` ### JDK diff --git a/pics/a6c20f60-5eba-427d-9413-352ada4b40fe.png b/pics/a6c20f60-5eba-427d-9413-352ada4b40fe.png new file mode 100644 index 0000000000000000000000000000000000000000..11d366536bcffad3e13bd291443b9eee0016a8c6 GIT binary patch literal 16384 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Ð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

8y2bG*r3w>O(mv^w-f#S#e?Y)-0waxf=KoP3Wu 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