一、我的理解
代理模式的主要作用是通过代理类来控制对目标类的访问。它主要强调的是代理类对被代理的类的访问进行一定控制。
二、实现方式
- 代理类和实体类都继承同一个接口(或抽象基类),具有相同的功能接口。
- 代理类内部维护一个实体类对象,真正的功能实现是调用改对象的接口。
三、Java实例
Image接口:提供一个共同的接口,这样便于抽象
public interface Image {
void display();
}
RealImage类:实际要访问的类
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
super();
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying "+fileName);
}
private void loadFromDisk(String fileName) {
System.out.println("Loading "+fileName);
}
}
ProxyImage类:代理
public class ProxyImage implements Image {
private RealImage readImage;
private String fileName;
public ProxyImage(String fileName) {
super();
this.fileName = fileName;
}
@Override
public void display() {
if(readImage==null) {
readImage = new RealImage(fileName);
}
readImage.display();
}
}
Demo类:测试
public class Demo {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
// 图像将从磁盘加载
image.display();
System.out.println();
// 图像将无法从磁盘加载
image.display();
}
}
四、Python源码
ProxyDesignPattern.py文件:
#coding=utf-8
class Subject(object):
def Request(self):
raise NotImplementedError()
class RealSubject(Subject):
def Request(self):
print "实际实现的类"
class Proxy(Subject):
def __init__(self):
self.readSubject = RealSubject()
def Request(self):
self.readSubject.Request()
if __name__=='__main__':
proxy = Proxy()
proxy.Request()
参考资料:
1.http://www.runoob.com/design-pattern/proxy-pattern.html
2.http://www.jianshu.com/p/b80e7395fd5f