前言
这个模式也是蛮好懂的~尤其是看到《武林外传》中小六表白把秀才的醋坛子打翻这截,太形象了~
代理模式
what
为其他对象提供一种代理以控制对这个对象的访问。其实就是在访问对象时引入一定程度的间接性。
说白了,代理就是真实对象的代表。
type
代理一般分为以下几种:
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。客户端程序调用代理就可以解决远程访问的问题。
- 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。比如:当你打开一个HTML网页时,里面可能有很多文字和图片,但是你还是可以很快打开它,此时你看到的时所有的文字,但图片却时一张一张地下载后才能看到。那些未打开的图片框,就是通过虚拟代理来代替了真实的图片。此时代理储存了真实图片的路径和尺寸。
- 安全代理,用来控制真实对象访问时的权限。
- 智能指引,是指当调用真实的对象时,代理处理另外一些事。
情景
大家都看过《武林外传》吗?里面有一段秀才不敢向小郭表白,跟小六抬杠时说:你敢向她表白吗?结果小六就大喊:”小郭,嫁给我怎么样?”结果这秀才可傻眼了,本想看他出丑,结果小郭还同意了。这事闹的~看来啊,这代理用不好,表白都成问题啊!
优点
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
(3).高扩展性
代码展示
代理接口:
这里要添加类→选择类下面的接口,便可以了。
interface IGiveGift //代理接口
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
被追求者类:
class SchoolGirl
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
追求者类:
//让追求者实现送礼物接口
class Pursuit:IGiveGift //追求者类
{
SchoolGirl mm;
public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Console.WriteLine(mm .Name +"送你洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(mm.Name +"送你鲜花");
}
public void GiveChocolate()
{
Console.WriteLine(mm.Name +"送你巧克力");
}
}
代理类:
//代理实现送礼物接口
class Proxy:IGiveGift
{
Pursuit gg;
public Proxy(SchoolGirl mm)
{
gg = new Pursuit(mm);
}
public void GiveDolls()
{
//在实现方法中去调用“追求者”类的相关方法
gg.GiveDolls();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
public void GiveChocolate()
{
gg.GiveChocolate();
}
}
客户端:
class Program
{
static void Main(string[] args)
{
SchoolGirl qianqian = new SchoolGirl();
qianqian.Name = "郭倩倩";
Proxy monkey = new Proxy(qianqian);
monkey.GiveDolls();
monkey.GiveFlowers();
monkey.GiveChocolate();
Console.Read();
}
}
效果图:
后记
学这个就像是做数学题,一开始不喜欢,但是做着做着就能上瘾,关键是做不完这一个,能连饭都不吃,真是有魔力啊!