加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

设计模式之代理模式

发布时间:2020-12-17 01:12:15 所属栏目:安全 来源:网络整理
导读:以男生追MM为例子 男A 要求 男B 帮他? 追求女C 未使用代理的案例 追求者A: ?class? Pursuit{ ????? ? SchoolGirl mm; ??????? public Pursuit(SchoolGirl mm){ ???????????? this.mm=mm; }? ??? public void GiveDolls( ){ ????? Console.WriteLine(mm.Name

以男生追MM为例子

男A 要求 男B 帮他? 追求女C

未使用代理的案例

追求者A:

?class? Pursuit{

????? ? SchoolGirl mm;

??????? public Pursuit(SchoolGirl mm){

???????????? this.mm=mm;

}?

??? public void GiveDolls( ){

????? Console.WriteLine(mm.Name+"送你洋娃娃");

}

? ? public void GiveFollwers(){

Console.WriteLine(mm.Name+"送你鲜花");

}

public void GiveChocolate(){

Console,WriteLine(mm.Name+"送你巧克力");

?

}

}

?

被追求者C

class SchoolGirl(){

?

public string Name{set;get;}

?

}

?

客户端代码

static void main(string[] args){

?? SchoolGirl jiaojiao =new SchoolGirl();

??jiaojiao.Name="C";

Pursuit?A =new Pursuit(jiaojiao);----------------------------------->A 直接向C 送花,送巧克力,并没有要B帮忙

A.GiveDolls();

A.GiveFolwers();

A.GiveChocolate();

A.Console.Read();

?

}

?

在之前的代码做改进

追求者

class? Proxy{

????? ? SchoolGirl mm;

??????? public Pursuit(SchoolGirl mm){

???????????? this.mm=mm;

}?

??? public void GiveDolls( ){

????? Console.WriteLine(mm.Name+"送你洋娃娃");

}

? ? public void GiveFollwers(){

Console.WriteLine(mm.Name+"送你鲜花");

}

public void GiveChocolate(){

Console,WriteLine(mm.Name+"送你巧克力");

?

}

}

?

被追求者:

class SchoolGirl(){

?

public string Name{set;get;}

?

}

?

客户端代码:

static void main(string[] args){

?? SchoolGirl jiaojiao =new SchoolGirl();

??jiaojiao.Name="C";

Proxy?A =new Proxy(jiaojiao);----------------------------------->是代理B主动向C献花,送巧克力,并没有体现A的存在

A.GiveDolls();

A.GiveFolwers();

A.GiveChocolate();

A.Console.Read();

?

}

?

再做改进:

代理接口:

interface IGiveGift( ){

void GiveDolls( );

void GiveFlowers( );

void GiveChocolate( );

}

追求者类 A

?

Class Pursuit : IGiveGift{

SchoolGirl mm;

Pubilc Pursuit(SchoolGirl mm){

this.mm=mm;

}

public void GiveDolls( ){

????? Console.WriteLine(mm.Name+"送你洋娃娃");

}

? ? public void GiveFollwers(){

Console.WriteLine(mm.Name+"送你鲜花");

}

public void GiveChocolate(){

Console,WriteLine(mm.Name+"送你巧克力");

?

}

?

}

?

被追求者 C:

?

class SchoolGirl(){

?

public string Name{set;get;}

?

}

代理类? B:

class Proxy : IGivegift{

Pursuit? A;

public Proxy (SchoolGirl mm){

A =new Pursuit(mm);

?

public void GiveDolls(){

A.GiveDolls();

}

public void GiveFlowers(){

A.GiveFlowers();

}

}public void GiveChocolate(){

A.GiveChocolate();

}

}

?

客户端代码

static void main(string[] args){

SchoolGirl C=new SchoolGirl();

C.Name="C";

Proxy B=new Proxy(C);-------------------------->B 中产生了A的对象,就是? B替A给C 送鲜花,巧克力

B.GiveDolls();

B.GiveFlowers();

B.GiveChocolate();

Console.Read();

}

?

代理模式:为其他对象提供一种代理 以控制对这个对象的访问,隐藏了真正要访问的类。

?

案例分析:

abstract?? class Subject{

public? abstract void Request();

}

?

?class RealSubject ?:Subject {

??????? public override Request(){

???????? ?Console.Write("真实的请求");

?????????????? }

???? }

?

?

?class Proxy :Subject {

??? ?RealSubject realSubject ;

??? public override?void Request()

? {

???????? if(realSubject ==null){

????? realSubject =new RealSubject();

}

?? realSubject.Request();

?

}?

}

static void main(string[] args){

Proxy proxy=new Proxy();

proxy.Request();

Console.Read();

}

?

应用场合:

1 远程代理??为一个对象在不同的地址空间 提供局部代表 可以隐藏一个对象在于 不同地址空间的事实?

?WebService? 在应用程序中添加WEB引用,引用一个WebService,会在项目中生成一个WEBREFERENCE的文件夹和一些文件,这些就是代理,使得客户端调用代理就可以解决远程访问的问题

2 虚拟代理? 是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,例如访问网页时,当网页中内容很多时,用户可以浏览到文章,然而图片却一直在加载,是因为那些图片是通过代理来代替真实的图片。

3 安全代理 控制对真实对象的访问

4智能指引 当调用一些真实的对象,代理去处理一些事情

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读