为对象提供代理,以控制对该对象的访问。
主要组成:
Subject-代理和实体的共用类或接口
Proxy-代理
RealSubject-实体
适配器与代理的区别:
适配器为对象提供一个不同的接口。代理提供与实体相同的接口。装饰和代理的区别:
装饰为对象动态添加额外功能。代理则控制对象的访问(不改变原有对象的功能),但可以在对象访问前后,做一些额外处理(比如,打日志、审计、事务等等)。典型例子:Spring AOP动态代理。相关类:
using System;namespace Proxy{ /// <summary> /// 网页(代理和实体的共用类或接口) /// </summary> abstract class WebpageSubject { public abstract string RequestWebpage(); } /// <summary> /// 浏览器(代理) /// </summary> class BrowserProxy : WebpageSubject { //真实网页(实体)(私有类使得只有浏览器才能访问真实网页) private class WebpageRealSubject : WebpageSubject { public override string RequestWebpage() { return "访问网页"; } } WebpageSubject webpageSubject; public override string RequestWebpage() { //延迟初始化 if (webpageSubject == null) { webpageSubject=new WebpageRealSubject(); } return webpageSubject.RequestWebpage(); } }}调用:
using System;namespace Proxy{ class Program { static void Main(string[] args) { WebpageSubject webpage = new BrowserProxy(); //访问网页 Console.WriteLine(webpage.RequestWebpage()); Console.Read(); } }}结果:
参考资料:《设计模式-可复用面对对象软件的基础》