代理模式-Proxy Pattern
代理模式Proxy Pattern
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难 时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。
模式结构:
代理模式的结构比较简单,其核心是代理类。
(1) Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。
(2) Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题 对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代 真实主题
(3) RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中 实现了真实的业务操作
下面的两个例子是静态代理:
举例:通过图片代理从磁盘加载图片
创建图片接口
1 package com.feimao.proxy.test; 2 3 public interface Image { 4 public void display(); 5 }
创建RealImage类
1 package com.feimao.proxy.test; 2 3 public class RealImage implements Image{ 4 private String filename; 5 public RealImage(String filename){ 6 this.filename = filename; 7 loadFromDisk(filename); 8 } 9 10 @Override 11 public void display() { 12 System.out.println("Displaying " + filename); 13 } 14 public void loadFromDisk(String filename){ 15 System.out.println("Loading " + filename); 16 } 17 }
创建image的代理类ProxyImage
1 package com.feimao.proxy.test; 2 3 public class ProxyImage implements Image { 4 private RealImage realImage; 5 private String filename; 6 public ProxyImage(String filename){ 7 this.filename = filename; 8 } 9 10 @Override 11 public void display() { 12 if(realImage == null){ 13 realImage = new RealImage(filename); 14 } 15 realImage.display(); 16 } 17 }
创建测试类
1 package com.feimao.proxy.test; 2 3 public class ProxyPartternDemo { 4 public static void main(String[] args){ 5 Image image = new ProxyImage("feimao.jpg"); 6 image.display(); 7 8 } 9 }
举例:打印日志的代理
创建UserDao接口
1 package com.feimao.proxy.test; 2 3 public interface UserDao { 4 public void delete(String name); 5 }
创建UserDao的实现类
1 package com.feimao.proxy.test; 2 3 4 public class UserDaoImpl implements UserDao { 5 6 @Override 7 public void delete(String name) { 8 System.out.println("删除成功!"); 9 } 10 11 }
创建LogProxy代理类
1 package com.feimao.proxy.test; 2 3 import java.util.logging.Level; 4 import java.util.logging.Logger; 5 6 public class LogProxy implements UserDao { 7 Logger logger = Logger.getLogger(this.getClass().getName()); 8 private UserDao dao; 9 LogProxy(UserDao dao){ 10 this.dao = dao; 11 } 12 13 @Override 14 public void delete(String name) { 15 logger.log(Level.INFO , "before delete"); 16 dao.delete("feimao"); 17 logger.log(Level.INFO , "after delete"); 18 } 19 }
创建测试类
1 package com.feimao.proxy.test; 2 3 public class Test { 4 public static void main(String[] args){ 5 /* UserDao dao = new UserDaoImpl(); 6 dao.delete("feimao");*/ 7 UserDao dao = new LogProxy(new UserDaoImpl()); 8 dao.delete("feimao"); 9 } 10 }
动态代理可以关注另外一篇博客 https://www.cnblogs.com/feimaoyuzhubaobao/p/10034424.html