为其他对象提供一种代理以控制对这个对象的访问
实现
我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。
ProxyPatternDemo 类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。
步骤 1
创建一个接口。
package com.itheima.dao; public interface Image { void display(); }
步骤 2
创建实现接口的实体类
package com.itheima.domain; import com.itheima.dao.Image; public class RealImage implements Image { private String fileName; public RealImage(String fileName){ this.fileName = fileName; loadFromDisk(fileName); } public void display() { System.out.println("Displaying " + fileName); } private void loadFromDisk(String fileName){ System.out.println("Loading " + fileName); } }
代理类
package com.itheima.domain; import com.itheima.dao.Image; public class ProxyImage implements Image { private RealImage realImage; private String fileName; public ProxyImage(String fileName){ this.fileName = fileName; } public void display() { if(realImage == null){ realImage = new RealImage(fileName); } realImage.display(); } }
步骤 3
当被请求时,使用 ProxyImage 来获取 RealImage 类的对象
package com.itheima.domain; import com.itheima.dao.Image; public class ProxyPatternDemo { public static void main(String[] args) { Image image = new ProxyImage("test_10mb.jpg"); // 图像将从磁盘加载 image.display(); System.out.println(""); // 图像不需要从磁盘加载 image.display(); } }
步骤 4
执行程序,输出结果:
G:\Java\jdk-9.0.4\bin\java "-javaagent:G:\IDEA2017\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=56066:G:\IDEA2017\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath G:\java所有代码\day01_01mybatis\target\classes;C:\Users\My\.m2\repository\org\mybatis\mybatis\3.4.5\mybatis-3.4.5.jar;C:\Users\My\.m2\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;C:\Users\My\.m2\repository\log4j\log4j\1.2.12\log4j-1.2.12.jar;C:\Users\My\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\My\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;G:\MAVEN\maven_repository com.itheima.domain.ProxyPatternDemo Loading test_10mb.jpg Displaying test_10mb.jpg Displaying test_10mb.jpg Process finished with exit code 0