设计模式——代理模式【Head First 设计模式】
程序员文章站
2022-03-03 09:49:05
代理模式——为另一个对象提供一个替身或占位符以控制对这个对象的访问。类图Subject,它为RealSubject和Proxy提供了接口,通过实现同一接口,Proxy在RealSubject出现的地方取代它。RealSubject是真正做事的对象,它是被proxy代理和控制访问的对象。Proxy持有RealSubject的引用。在某些例子中,Peoxy还会负责RealSubject对象的创建和销毁。客户和RealSubject的交互都必须通过Proxy。因为Proxy和RealSubject实现相...
代理模式——为另一个对象提供一个替身或占位符以控制对这个对象的访问。
类图
Subject,它为RealSubject和Proxy提供了接口,通过实现同一接口,Proxy在RealSubject出现的地方取代它。
RealSubject是真正做事的对象,它是被proxy代理和控制访问的对象。
Proxy持有RealSubject的引用。在某些例子中,Peoxy还会负责RealSubject对象的创建和销毁。客户和RealSubject的交互都必须通过Proxy。因为Proxy和RealSubject实现相同的接口(Subject),所以任何用到RealSubject的地方,都可以用Proxy取代。Proxy也控制了对RealSubject的访问。在某些情况下,我们可能需要这样的控制。这些情况包括RealSubject是远程的对象,RealSubject创建开销大,或RealSubject需要被保护。
举例展示
代码实现
1.创建接口
public interface Image {
void display();
}
2.真实类
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.代理类
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
4.测试类
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
/***output
Loading test_10mb.jpg
Displaying test_10mb.jpg
Displaying test_10mb.jpg
***/
总结
1.代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。
2.远程代理管理客户和远程对象之间的交互,虚拟代理控制访问实例化开销大的对象,保护代理基于调用这控制对象方法的访问。
3.代理在结构上类似装饰者,但是目的不同。装饰者模式为对象加上行为,而代理则是控制访问。
如有错误欢迎评论指正。
本文地址:https://blog.csdn.net/Aquaman_/article/details/109638747