代理模式(Proxy):
给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
通俗的来讲代理模式就是我们生活中常见的中介。
VPN 翻墙软件 黄牛 代售点
调用
{
Console.WriteLine("**************************************");
Console.WriteLine("This is 结构型设计模式-代理模式Proxy");
ProxyProgram.Show();
}
业务接口
/// <summary>
/// 业务接口
/// </summary>
public interface ISubject
{
/// <summary>
/// get
/// </summary>
/// <returns></returns>
bool GetSomething();
/// <summary>
/// do
/// </summary>
void DoSomething();
}
public class ProxyProgram
{
public static void Show()
{
{
Console.WriteLine("************原生模式1************");
ISubject subject = new RealSubject();
subject.DoSomething();
subject.GetSomething();
}
{
Console.WriteLine("************原生模式2************");
ISubject subject = new RealSubject();
subject.DoSomething();
subject.GetSomething();
}
{
Console.WriteLine("*************代理模式1***********");
ISubject subject = new ProxySubject();
subject.DoSomething();
subject.GetSomething();
//毫无意义??
}
{
Console.WriteLine("*************代理模式2***********");
ISubject subject = new ProxySubject();
subject.DoSomething();
subject.GetSomething();
//毫无意义??
}
{
//why
}
}
}
/// <summary>
/// 代理
///
/// 日志/异常/单例/缓存/安全/延迟/权限/事务/远程
///
/// 要求动作加个日志
/// 有了代理之后,可以通过代理来扩展功能,避免对RealSubject的修改
///
/// 单例代理:特简单,加个static
/// 缓存代理:加个缓存,结果存一下,重用一下
///
///
/// 跟AOP面向切面编程很像?对了!主流AOP实现,靠的就是代理模式(动态代理)
/// </summary>
public class ProxySubject : ISubject//不一定非得实现同一个接口
{
private static ISubject _iSubject = new RealSubject(); // 单例代理:特简单,加个static
public void DoSomething()
{
try
{
Console.WriteLine("Prepare");
_iSubject.DoSomething();
Console.WriteLine("After");
}
catch (Exception ex)
{
throw;
}
}
private static Dictionary<string, bool> ProxySubject_Dictionary = new Dictionary<string, bool>();
public bool GetSomething()
{
string key = $"{nameof(ProxySubject)}.{nameof(GetSomething)}parameter";
// 缓存代理:加个缓存,结果存一下,重用一下
if (ProxySubject_Dictionary.ContainsKey(key))
{
return ProxySubject_Dictionary[key];
}
else
{
bool bResult = _iSubject.GetSomething();
ProxySubject_Dictionary.Add(key, bResult);
return bResult;
}
//return _iSubject.GetSomething();
}
}
//代理模式和适配有啥区别
/// <summary>
/// 一个耗时耗资源的对象方法
/// 一个第三方封装的类和方法
///
/// 关注的是业务逻辑--要添加其他逻辑,最好不要折腾我
/// </summary>
public class RealSubject : ISubject
{
public RealSubject()
{
Thread.Sleep(2000);
long lResult = 0;
for (int i = 0; i < 100000000; i++)
{
lResult += i;
}
Console.WriteLine("RealSubject被构造。。。");
}
/// <summary>
/// 火车站查询火车票
/// </summary>
public bool GetSomething()
{
//Console.WriteLine("Prepare");//这得修改Real
Console.WriteLine("坐车去火车站看看余票信息。。。");
Thread.Sleep(3000);
Console.WriteLine("到火车站,看到是有票的");
//Console.WriteLine("After");
return true;
}
/// <summary>
/// 火车站买票
/// </summary>
public void DoSomething()
{
Console.WriteLine("开始排队。。。");
Thread.Sleep(2000);
Console.WriteLine("终于买到票了。。。");
}
}
总结一下
核心套路:包一层!
代理模式只能添加通用逻辑,不能增加业务逻辑
应用场景: 调用WebService/WCF服务---O/RM
区别
因为核心套路是一样的,都是包一层,都是利用组合;
设计模式是解决问题的具体套路,不同的设计模式是解决不同问题的;
适配器解决对象适配的问题--------------可能增加减少;
代理模式解决的是对象的调用问题-----是不允许参与业务;
其实多个结构型设计模式本质是一样的(包一层),只不过招数略有不同,在 不同的场景下,给起了个不同的名字。