在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
代理模式:为其他对象提供一种代理以控制这个对象的访问
1.追MM那点事
一个校园女孩mm,公园散步;小伙子gg,在公园偶遇mm,一见钟情;但是gg不认识mm,没胆送礼物,于是找到代理Proxy,让其帮忙送礼物;
首先定义一个校园女孩mm,让其在公园散步
/// <summary> /// 校园女孩类 /// </summary> public class SchoolGirl { public string Name { get; set; } }
其次,分析送礼物这个事,是gg送礼物,而不是proxy要送礼物,proxy只是帮忙送礼物。因此gg和proxy都有送礼物这个动作。抽象出来一个接口GiveGift
/// <summary> /// 送礼物接口 /// </summary> public interface GiveGift { void GiveDolls(); void GiveFlowers(); }
gg对女孩一见钟情,要送礼物给女孩(将女孩的照片内置到追求者心中==类中),所以定义一个最求者类,并包含几个送礼物的方法
/// <summary> /// 追求者类 /// </summary> public class Pursuit : GiveGift { protected SchoolGirl mm; public Pursuit(SchoolGirl mm) { this.mm = mm; } public void GiveDolls() { Console.WriteLine(mm.Name + "送你洋娃娃"); } public void GiveFlowers() { Console.WriteLine(mm.Name + "送你鲜花"); } }
gg是个笨蛋,想送不敢自己去,要找代理帮他送。定义一个代理类,帮他送礼物
/// <summary> /// 代理类 /// </summary> public class Proxyor : GiveGift { Pursuit gg; public Proxyor(Pursuit gg) { this.gg = gg; } public void GiveDolls() { gg.GiveDolls(); } public void GiveFlowers() { gg.GiveFlowers(); } }
回放整个gg追求mm的过程
static void Main(string[] args) { //一个校园女孩mm,公园散步 SchoolGirl mm = new SchoolGirl(); mm.Name = "娇娇"; //小伙子gg,在公园偶遇mm,一见钟情 Pursuit gg = new Pursuit(mm); //但是gg不认识mm,没胆送礼物,于是找到代理Proxy,让其帮忙送礼物 Proxyor proxy = new Proxyor(gg); proxy.GiveDolls(); proxy.GiveFlowers(); }
有图有真相