Computer Science Design Patterns/Proxy
From Wikibooks, open books for an open world
[edit] Java
The following Java example illustrates the "virtual proxy" pattern. The ProxyImage class is used to access a remote method.
interface Image { public abstract void displayImage(); } //on System A class RealImage implements Image { private String filename; public RealImage(String filename) { this.filename = filename; loadImageFromDisk(); } private void loadImageFromDisk() { System.out.println("Loading " + filename); } public void displayImage() { System.out.println("Displaying " + filename); } } //on System B class ProxyImage implements Image { private String filename; private RealImage image; public ProxyImage(String filename) { this.filename = filename; } public void displayImage() { if (image == null) { image = new RealImage(filename); } image.displayImage(); } } class ProxyExample { public static void main(String[] args) { Image image1 = new ProxyImage("HiRes_10MB_Photo1"); Image image2 = new ProxyImage("HiRes_10MB_Photo2"); image1.displayImage(); // loading necessary image2.displayImage(); // loading necessary image1.displayImage(); // loading unnecessary } }
The program's output is:
Loading HiRes_10MB_Photo1 Displaying HiRes_10MB_Photo1 Loading HiRes_10MB_Photo2 Displaying HiRes_10MB_Photo2 Displaying HiRes_10MB_Photo1
[edit] C#
using System; namespace Proxy { class Program { interface IImage { void Display(); } class RealImage : IImage { public RealImage(string fileName) { FileName = fileName; LoadFromFile(); } private void LoadFromFile() { Console.WriteLine("Loading " + FileName); } public String FileName { get; private set; } public void Display() { Console.WriteLine("Displaying " + FileName); } } class ProxyImage : IImage { public ProxyImage(string fileName) { FileName = fileName; } public String FileName { get; private set; } private IImage image; public void Display() { if (image == null) image = new RealImage(FileName); image.Display(); } } static void Main(string[] args) { IImage image = new ProxyImage("HiRes_Image"); for (int i = 0; i < 10; i++) image.Display(); } } }
The program's output is:
Loading HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image Displaying HiRes_Image