代理模式(Proxy)

为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。    代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
   应用场景:例如:假设有一组对象都实现同一个接口,实现同样的方法,但这组对象中有一部分对象需要有单独的方法,传统的笨办法是在每一个应用端都加上这个单独的方法,但是代码重用性低,耦合性高。如果用代理的方法则很好的解决了这个问题,
   其实从字面解释会更加容易,很容易就想到代理商:货物的所有权属于厂家,而代理商只是帮助厂家进行一些销售行为等,当然也可以有自己的行为,比如下面的例子中,商家就可以单独的去给商品做销售活动,而跟厂家没有直接关系。

例子:买家需要买一些东西,但自己暂时不想出去。这样就可以指派代理去帮自己购买…

// 定义一个购买商品行为接口

interface Purchase
{
void BuyPhone();
void BuyCosmetics();
void BuyGame();
}

//定义自己
class People
{
private string name;
public string Name
{
get { return name; }
set { this.name = value; }
}
}

class Buyers : Purchase
{
People people;

public Buyers(People people)
{
this.people = people;
}

public void BuyCosmetics()
{
Console.WriteLine(people.Name + “自己去买:化妆品”);
}

public void BuyGame()
{
Console.WriteLine(people.Name + “自己去买:游戏”);
}

public void BuyPhone()
{
Console.WriteLine(people.Name + “自己去买:手机”);
}
}

 

//定义代理

class PurchasingAgent : Purchase
{
People people;

public PurchasingAgent(People people)
{
this.people = people;
}

public void BuyCosmetics()
{
Console.WriteLine(people.Name + “代购去买:化妆品”);
}

public void BuyGame()
{
Console.WriteLine(people.Name + “代购去买:游戏”);
}

public void BuyPhone()
{
Console.WriteLine(people.Name + “代购去买:手机”);
}
}

class Program
{
static void Main(string[] args)
{
People people = new People();
people.Name = “小明”;

//自己购买
Buyers buyers = new Buyers(people);
buyers.BuyPhone();
buyers.BuyGame();
buyers.BuyCosmetics();

//代购购买
PurchasingAgent purchasingAgent = new PurchasingAgent(people);
purchasingAgent.BuyPhone();
purchasingAgent.BuyGame();
purchasingAgent.BuyCosmetics();
Console.Read();
}
}

 

总结一下

代理模式应用场合:

1、远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地抵制空间的事实。(PS:好比一个D盘,里面有很多子文件夹,其实它们就是代理)

2、虚拟代理,是更具需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

(PS:比如打开一个很大的HTML网页时,里面可能有很多的文字和图片,但你还是可以很快打开它,此时你所看到的是所有的文字,但图片却是一张一张地下载才能看到。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理储存了真实图片的路径和尺寸。)

3、安全代理,用来控制真实对象访问时的权限。(PS:一般用于对象应该有不同权限的时候)

4、智能指引,是指当调用真实的对象时,代理处理另外一些事。

(PS:如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已锁定它,以确保其它对象不能改变它。它们都是通过代理在访问一个对象时附加的一些内务处理。)

代理模式主要是用了面对对象的多态性。对于某种共同的行为,代理类是代购者,幕后主使人是买家,完成买家的需求就会有好的报酬,可以知道,他们是同穿一条裤子,你要做啥我都清楚的很,因为有同一个行为接口。O(∩_∩)O