以男生追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智能指引 当调用一些真实的对象,代理去处理一些事情