代理模式

分类专栏:
设计模式

文章标签:
设计模式
结构型模式
原创

代理模式

一个类代表另一个类的功能,在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口

静态代理与动态代理区别

1)静态代理

创建出一个代理类,这个代理类与目标类实现了同一个接口,当去使用目标对象的时候,不是直接创建目标对象,而是创建代理对象,去调用目标对象中的方法

2)动态代理

基于静态代理的理解上,动态代理其实就是直接给某一个目标对象生成一个代理对象,而不需要代理类存在
动态代理与静态代理原理是一样的,只是它没有具体的代理类,而直接通过反射生成了一个代理对象

创建意图与使用步骤

意图:为其他对象提供一种代理以控制对这个对象的访问
主要解决:在直接访问对象时带来的问题
何时使用:想在访问一个类时做一些控制
如何解决:增加中间层
关键代码:实现与被代理类组合

优缺点

优点:

1)职责清晰
2)高扩展性
3)智能化

缺点:

1)由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂

实现

1.创建一个接口
public interface Image {
   void display();
}
2.创建实现接口的实体类
public class RealImage implements Image {

   private String fileName;

   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }

   @Override
   public void display() {
      System.out.println("Displaying " + fileName);
   }

   private void loadFromDisk(String fileName){
      System.out.println("Loading " + fileName);
   }
}
public class ProxyImage implements Image{

   private RealImage realImage;
   private String fileName;

   public ProxyImage(String fileName){
      this.fileName = fileName;
   }

   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}
3.当被请求时,使用ProxyImage来获取RealImage类的对象
public class ProxyPatternDemo {

   public static void main(String[] args) {

      Image image = new ProxyImage("test_10mb.jpg");

      // 图像将从磁盘加载
      image.display();
      System.out.println("");
      // 图像不需要从磁盘加载
      image.display();
   }
}
4.执行输出
Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg
  • 作者:潘震
  • 评论

    pz
    测试
    留言