代理模式(Proxy Pattern)中,一个类代表另一个类的功能。创建具有现有对象的对象,以便向外界提供功能接口。 优点: 1. 职责清晰。 2. 高扩展性。 3. 智能化。 缺点: 1. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
1. 代理模式
package com.andrew.pattern0203.proxy.model01; public interface Image { void display(); }
package com.andrew.pattern0203.proxy.model01; 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); } }
package com.andrew.pattern0203.proxy.model01; public class ProxyImage implements Image { private RealImage realImage; private String fileName; public ProxyImage(String fileName) { this.fileName = fileName; } @Override public void display() { if (null == realImage) { realImage = new RealImage(fileName); } realImage.display(); } }
package com.andrew.pattern0203.proxy.model01; /** * 1. 代理模式 * * @author andrew * @date 2018/07/01 */ public class Client { public static void main(String[] args) { Image image = new ProxyImage("test_img.jpg"); image.display(); System.out.println(""); image.display(); } } 运行结果: Loading:test_img.jpg Displaying:test_img.jpg Displaying:test_img.jpg
2. Java中代理模式
public abstract class Subject{ public abstract void request(); }
public class RealSubject extends Subject{ public void request(){ System.out.println("From real subject."); } }
public class ProxySubject extends Subject{ private RealSubject realSubject; //代理角色内部引用了真实角色 public void request(){ this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realSubject){ realSubject = new RealSubject(); } realSubject.request(); //真实角色所完成的事情 this.postRequest(); //在真实角色操作之后所附加的操作 } private void preRequest(){ System.out.println("pre request"); } private void postRequest(){ System.out.println("post request"); } }
public class Client{ public static void main(String[] args){ Subject subject = new ProxySubject(); subject.request(); } } 运行结果: pre request From real subject. post request