设计模式-代理模式(Proxy)
简介:
为其他对象提供一种代理以控制对这个对象的访问。(在访问真实对象时,引入一定程度的间接性,因为这种间接性可以附加多种用途)【结构型模式】
结构图:
优点:
- 高扩展性;
- 代理作为调用者和真实对象的中间层,降低了模块间的耦合性。
缺点:
- 由于在客户端和真实对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求处理的速度变慢;
- 实现代理模式需要增加额外的代码,有些代码模式的实现可能很复杂。
应用场景:
- 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏这个对象存在于不同地址空间的事实;
- 安全代理:用来控制真实对象访问时的权限;
- 虚拟代理:在创建一些占用大量内存或处理复杂的对象时,虚拟代理把这些对象推迟到真正使用它们时创建。对象被应用在第一次引用时创建,并同一个实例被重复使用;
- 智能指引:当调用真实对象时,代理可以做一些其他的逻辑。
注意事项:
- 和装饰模式的区别:装饰模式为了增强功能,代理模式为了加以控制;
- 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,代理模式不能改变所代理类的接口。
示例:
1.结构类图的实现:
ISubject类,定义了RealSubject和Proxy的公用接口。在任何使用RealSubject的地方都可以使用Proxy。
RealSubject类,定义Proxy所代表的真实实体。
Proxy类,保存一个引用使得代理可以访问实体,并提供一个与ISubject的接口相同的接口,这样代理就可以用来代替实体。
/// <summary>
/// 主题
/// </summary>
public interface ISubject
{
void Request();
}
/// <summary>
/// 真实主题
/// </summary>
public class RealSubject : ISubject
{
public void Request()
{
Console.WriteLine("真实的请求");
}
}
/// <summary>
/// 代理类
/// </summary>
public class Proxy : ISubject
{
RealSubject real;
public void Request()
{
if (real == null) real = new RealSubject();
real.Request();
}
}客户端
Proxy proxy = new Proxy(); proxy.Request();
结果

2.代理模式之撩妹
撩妹的最高境界就是,不用自己亲自出马,找个代理人送花,送巧克力就行。撩妹就是【Subject】,追求者就是【RealSubject】,代理人就是【Proxy】了。
美女和撩妹技巧
/// <summary>
/// 美女
/// </summary>
public class Beauty
{
public string Name;
public Beauty(string name)
{
Name = name;
}
}
/// <summary>
/// 撩妹技巧
/// </summary>
public interface IChaseGirl
{
/// <summary>
/// 送花
/// </summary>
void GiveFlowers();
/// <summary>
/// 送巧克力
/// </summary>
void GiveChocolate();
}追求者和代理人
/// <summary>
/// 追求者
/// </summary>
public class Pursuit : IChaseGirl
{
private Beauty mm;
public Pursuit(Beauty mm)
{
this.mm = mm;
}
public void GiveChocolate()
{
Console.WriteLine("送给{0}的巧克力~", mm.Name);
}
public void GiveFlowers()
{
Console.WriteLine("送给{0}的花~", mm.Name);
}
}
/// <summary>
/// 代理者
/// </summary>
public class Proxy: IChaseGirl
{
/// <summary>
/// 真实追求者
/// </summary>
private Pursuit pursuit;
public Proxy(Beauty mm)
{
pursuit = new Pursuit(mm);
}
public void GiveChocolate()
{
pursuit.GiveChocolate();
}
public void GiveFlowers()
{
pursuit.GiveFlowers();
}
}客户端
Beauty mm = new Beauty("紫霞仙子");
Proxy proxy = new Proxy(mm);
proxy.GiveChocolate();
proxy.GiveFlowers();结果

话说紫霞仙子最后爱上了谁呢?追求者还是代理者?当然代理者啦,东西虽然真实的送出者是追求者,但整个过程中他的面都没有露过啊。
撩妹都要用代理模式,这难道就是程序猿单身的原因?
请多多指教~
相关推荐
windle 2020-10-29
tinydu 2020-08-03
标题无所谓 2020-06-26
程序员俱乐部 2020-06-08
薛正华 2020-05-30
itmale 2020-05-26
fangxiaoji 2020-05-12
横云断岭 2020-04-26
hygbuaa 2020-04-23
wanghongsha 2020-04-09
sicceer 2020-02-23
liym 2020-02-13
zllbirdonland 2020-01-11
chenjia00 2020-01-07
paopao00 2020-01-07
hygbuaa 2020-01-01