zoukankan      html  css  js  c++  java
  • java设计模式之代理模式

    一、代理模式简介
    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,并执行现有对象的相关方法,以便向外界提供功能接口。一般代理模式主要解决直接访问对象不合适的情形。比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,即使用代理模式。
    代理模式的应用实例: 
    1、Windows 里面的快捷方式。
    2、spring aop。
    3、远程代理、虚拟代理、防火墙代理等。


    二、实例演示
    1、业务分析
    加入我们需要从电脑磁盘中读取一个图片对象,因为图片对象相对较大,我们采用代理模式来操作图片。
    2、创建一个图片类的接口和实现了该接口的图片实体类
    Image.java
    public interface Image {
       void display();
    }


    RealImage.java
    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);
       }
    }




    3、建立一个代理类ProxyImage,以此来减少 RealImage 对象加载的内存占用。
    ProxyImage.java

    public class ProxyImage implements Image{//代理类也实现了图片接口
    
    
       private RealImage realImage;//持有一个图片实体类的引用
       private String fileName;
    
    
       public ProxyImage(String fileName){
          this.fileName = fileName;
       }
    
    
       @Override
       public void display() {//这里实际是realImage这个实例在操作
          if(realImage == null){
             realImage = new RealImage(fileName);
          }
          realImage.display();
       }
    }




    4、测试
    ProxyDemo.java

    public class ProxyDemo {
    	
       public static void main(String[] args) {
          Image image = new ProxyImage("test.jpg");//调用代理类的初始化方法
    
    
          //图像将从磁盘加载
          image.display(); 
       }
    }


    三、总结
    代理模式主要使用了java的多态,表面上来看是代理类(ProxyImage)进行的相关操作,但在代理类的内部,正真执行操作的是被代理类(RealImage)。能完成这个的前提是:代理类和被代理类实现了同一个接口,代理类“知道”被代理类中的属性和方法,所以可以进行代理操作。
    代理模式和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 
    代理模式和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。


  • 相关阅读:
    Springboot 之 自定义配置文件及读取配置文件
    SQLSERVER系统视图 sql server系统表详细说明
    MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
    使用Ecplise git commit时出现"There are no stages files"
    maven添加sqlserver的jdbc驱动包
    java将XML文档转换成json格式数据
    java将XML文档转换成json格式数据
    cannot be resolved. It is indirectly referenced from required .class files
    org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2012-12-12 12:01:01': not a valid representation (error: Can not parse date "2012-12-
    @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653225.html
Copyright © 2011-2022 走看看