• java 四种实现延迟加载的方法


    1. 延迟初始化

    2. 虚拟代理(virtual proxy)

    原文地址:   http://www.oodesign.com/proxy-pattern.html

    Intent

    • The intent of this pattern is to provide a 《Placeholder》 for an object to control references to it.

    Implementation

    The figure below shows a UML class diagram for the Proxy Pattern:

    Proxy Pattern Implementation - UML Class Diagram

    The participants classes in the proxy pattern are:

      • Subject - Interface implemented by the RealSubject and representing its services. The interface must be implemented by the proxy as well so that the proxy can be used in any location where the RealSubject can be used.
      • Proxy
        • Maintains a reference that allows the Proxy to access the RealSubject.
        • Implements the same interface implemented by the RealSubject so that the Proxy can be substituted for the RealSubject.
        • Controls access to the RealSubject and may be responsible for its creation and deletion.
        • Other responsibilities depend on the kind of proxy.
      • RealSubject - the real object that the proxy represents.

    Applicability & Examples

    The Proxy design pattern is applicable when there is a need to control access to an Object, as well as when there is a need for a sophisticated reference to an Object. Common Situations where the proxy pattern is applicable are:

      • Virtual Proxies: delaying the creation and initialization of expensive objects until needed, where the objects are created on demand (For example creating the RealSubject object only when the doSomething method is invoked).
      • Remote Proxies: providing a local representation for an object that is in a different address space. A common example is Java RMI stub objects. The stub object acts as a proxy where invoking methods on the stub would cause the stub to communicate and invoke methods on a remote object (called skeleton) found on a different machine.
      • Protection Proxies: where a proxy controls access to RealSubject methods, by giving access to some objects while denying access to others.
      • Smart References: providing a sophisticated access to certain objects such as tracking the number of references to an object and denying access if a certain number is reached, as well as loading an object from database into memory on demand.

    Example - Virtual Proxy Example.

    Consider an image viewer program that lists and displays high resolution photos. The program has to show a list of all photos however it does not need to display the actual photo until the user selects an image item from a list.

    Proxy Pattern Virtual Proxy Example - UML Class Diagram 

    The code below shows the Image interface representing the Subject. The interface has a single method showImage() that the Concrete Images must implement to render an image to screen.

    package proxy;
    
    /**
     * Subject Interface
     */
    public interface Image {
    
    	public void showImage();
    	
    }
    

    The code below shows the Proxy implementation, the image proxy is a virtual proxy that creates and loads the actual image object on demand, thus saving the cost of loading an image into memory until it needs to be rendered:

    package proxy;
    
    /**
     * Proxy
     */
    public class ImageProxy implements Image {
    
    	/**
    	 * Private Proxy data 
    	 */
    	private String imageFilePath;
    	
    	/**
    	 * Reference to RealSubject
    	 */
    	private Image proxifiedImage;
    	
    	
    	public ImageProxy(String imageFilePath) {
    		this.imageFilePath= imageFilePath;	
    	}
    	
    	@Override
    	public void showImage() {
    
    		// create the Image Object only when the image is required to be shown
    		
    		proxifiedImage = new HighResolutionImage(imageFilePath);
    		
    		// now call showImage on realSubject
    		proxifiedImage.showImage();
    		
    	}
    
    }
    

    The code below displays the RealSubject Implementation, which is the concrete and heavyweight implementation of the image interface. The High resolution image, loads a high resolution image from disk, and renders it to screen when showImage() is called.

    package proxy;
    
    /**
     * RealSubject
     */
    public class HighResolutionImage implements Image {
    
    	public HighResolutionImage(String imageFilePath) {
    		
    		loadImage(imageFilePath);
    	}
    
    	private void loadImage(String imageFilePath) {
    
    		// load Image from disk into memory
    		// this is heavy and costly operation
    	}
    
    	@Override
    	public void showImage() {
    
    		// Actual Image rendering logic
    
    	}
    
    }
    

    The code below illustrates a sample image viewer program; the program simply loads three images, and renders only one image, once using the proxy pattern, and another time directly. Note that when using the proxy pattern, although three images have been loaded, the High resolution image is not loaded into memory until it needs to be rendered, while in the part not using the proxy, the three images are loaded into memory although one of them is actually rendered.

    package proxy;
    
    /**
     * Image Viewer program
     */
    public class ImageViewer {
    
    	
    	public static void main(String[] args) {
    		
    	// assuming that the user selects a folder that has 3 images	
    	//create the 3 images 	
    	Image highResolutionImage1 = new ImageProxy("sample/veryHighResPhoto1.jpeg");
    	Image highResolutionImage2 = new ImageProxy("sample/veryHighResPhoto2.jpeg");
    	Image highResolutionImage3 = new ImageProxy("sample/veryHighResPhoto3.jpeg");
    	
    	// assume that the user clicks on Image one item in a list
    	// this would cause the program to call showImage() for that image only
    	// note that in this case only image one was loaded into memory
    	highResolutionImage1.showImage();
    	
    	// consider using the high resolution image object directly
    	Image highResolutionImageNoProxy1 = new HighResolutionImage("sample/veryHighResPhoto1.jpeg");
    	Image highResolutionImageNoProxy2 = new HighResolutionImage("sample/veryHighResPhoto2.jpeg");
    	Image highResolutionImageBoProxy3 = new HighResolutionImage("sample/veryHighResPhoto3.jpeg");
    	
    	
    	// assume that the user selects image two item from images list
    	highResolutionImageNoProxy2.showImage();
    	
    	// note that in this case all images have been loaded into memory 
    	// and not all have been actually displayed
    	// this is a waste of memory resources
    	
    	}
    		
    }
    



    Specific problems and implementation

    Java Remote Method Invocation (RMI)

    In java RMI an object on one machine (executing in one JVM) called a client can invoke methods on an object in another machine (another JVM) the second object is called a remote object. The proxy (also called a stub) resides on the client machine and the client invokes the proxy in as if it is invoking the object itself (remember that the proxy implements the same interface that RealSubject implements). The proxy itself will handle communication to the remote object, invoke the method on that remote object, and would return the result if any to the client. The proxy in this case is a Remote proxy.

    3. 保值器(value holder)

    4. 备份(ghost)

  • 相关阅读:
    强制隐藏android键盘
    百度地图3.7.1和传感器的应用
    百度地图3.7.1获取当前的位置,并自定义自身位置的图标
    百度地图3.7.1的卫星地图,实时交通的改变
    百度地图3.7.1的配置
    RecyclerView的ListView显示效果
    单元测试
    自定义侧滑菜单
    synchronized关键字的用法
    Android 开发中R文件的丢失
  • 原文地址:https://www.cnblogs.com/davidwang456/p/4071607.html
Copyright © 2020-2023  润新知