为对象提供代理,以控制对该对象的访问。
主要组成:
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();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》