设计模式——代理模式

来源:互联网 发布:java控制鼠标移动 编辑:程序博客网 时间:2024/06/05 07:24
转载请注明出处!
代理模式说明:为其他对象提供一种代理以控制对这个对象的访问。
以下是代理模式的基本模版代码:

//抽象对象类,定义了RealSubject和Proxy的共用接口
//这样就在任何使用RealSubject的地方都可以使用Proxy
abstract class Subject
{
public abstract void Request();//抽象方法,代理者和实体都重写
}

//实体类,是代理者Proxy所代表的真是实体
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("真是的请求");
}
}

//代理者的类,保存一个引用使得代理可以访问实体,
//并继承自Subject,重写抽象接口,这样代理就可以用来替代实体
class Proxy : Subject
{
RealSubject realSubject = null;

//这里调用请求方法,实际是调用实体的请求方法
public override void Request()
{
if(realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}

//客户端程序
class MainProgram
{
public void Main()
{
Proxy proxy = new Proxy();
proxy.Request();

Console.ReadKey();
}
}

其实代理模式不难理解,就是访问者(客户端)通过代理对象(Proxy)间接访问被访问者(RealSubject实体)。代理模式一般用在以下几种场合:一、远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象在于不同地址空间的事实(.Net中的WebService就是典型的代理模式运用,引用一个WebService 会在项目中生成一些文件夹和文件,它们就是代理,以此来解决远程访问的问题);二、虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象(例如打开一个网站时,网速一般的情况下,经常是先显示所有的文字,然后图片却是慢慢的 加载出来,未加载出来的图片空框,就是通过虚拟代理来替代的真是图片);三、安全代理,用来控制真是对象访问时的权限,一般用于对象有不同的访问权限的时候四、智能指引,是指当调用真实对象时,代理处理另外一些事

下面举一个代理模式的实际例子,例如男生在追求女生时,经常会通过中间人(朋友或其他熟悉的人)来间接接近女生,男生可以通过中间人来送礼物或者约出来玩,这个中间人其实就是代理,而追求者就是访问者,被追求者就是被访问者。OK,话不多说,直接上代码:

//这里面的主角——漂亮的美眉
class Girl
{
private string name;
public string Name
{
get { return name; }
}

public Girl(string name)
{
this.name = name;
}
}

//追求行为的接口,代理人和追求者都实现里面的接口
public interface IGiveGift
{
void GiveGift(string giftName); //赠送礼物的方法

void DateOne(); //约会的方法
}

//追求者,实现追求的接口

class Pursuit : IGiveGift { private Girl girl;//保存追求的美眉 public Pursuit(Girl girl) { this.girl = girl; }//约会 public void DateOne() { Console.WriteLine("想约" + girl.Name + "出去吃饭!"); }//送礼物 public void GiveGift(string giftName) { Console.WriteLine(girl.Name + ",送你" + giftName); } }
    //代理人,实现追求行为的接口(其实是帮追求者实现的)
class Proxy : IGiveGift
{
Pursuit pursuit = null;//保存追求者
public Proxy(Girl girl)
{
pursuit = new Pursuit(girl); //代理创建追求者
}

public void DateOne()
{
pursuit.DateOne(); //实现方法调用追求者相应的方法
}

public void GiveGift(string giftName)
{
pursuit.GiveGift(giftName); //实现方法调用追求者相应的方法
}
}
    class Program //客户端程序
{
static void Main(string[] args)
{
Girl girl = new Girl("美眉");//首先要有一个美眉

Proxy proxy = new Proxy(girl); //其次是代理人,而追求者就隐藏在代理人中

proxy.GiveGift("巧克力");
proxy.GiveGift("鲜花");
proxy.DateOne(); //约会

Console.ReadKey();
}
}
0 0
原创粉丝点击