一个典型[Proxy Pattern][代理模式]范例

什么是代理模式?

代理模式是通过一个简单的对象来实现复杂的对象。当创建一个对象需要消耗很多时间或资源的时候,代理类可以在你需要的时候才创建这个复杂对象。就像是别人借你10万块但是不急着用,所以你也不急着给,等他真正需要的时候再给他。也像厂家找一个渠道代理一样,东西先借给别人卖,不急着收款,周末或者月底再清账。代理是充当两个不相干终端的沟通者角色了

什么时候使用代理模式最合适?

  1. 加载一个对象,比如一幅大的图片,需要花很多时间来加载。 
  2. 计算结果需要很长的一段时间,可以显示一个临时的结果来继续计算,提示用户等待
  3. 对象在远程机器上,通过网络加载需要很多时间
  4. 访问对象的权限受到限制,譬如跨域操作,或者查询web service。通过代理类来得到授权

 创建一个winform程序,在Form1种加入 init() 初始化一个ImageProxy对象。winform中已经有一个picturebox对象和一个button对象

form1.cs
private   void  init()  {
    imgProxy 
= new ImageProxy ();
}

public  Form1()  {
    InitializeComponent();
    init();
}

picurebox控件通过imgProxy.getImage() 方法来获取一个比较大的图片,这个图片可能非常大,或者是国外的服务器速度很慢,抑或者是跨域的操作,防盗链了。

private   void  button1_Click( object  sender, System.EventArgs e)  {
    Pic.Image 
= imgProxy.getImage ();
}

一个proxy基类

Imager.cs
using  System;
using  System.Drawing ;
namespace  Proxy
{
    
/// <summary>
    
/// 一个Imager对象接口,返回Image对象
    
/// </summary>

    public interface Imager     {
        Image getImage() ;        
    }

}

 

ImageProxy.cs
using  System;
using  System.Drawing ;
using  System.Threading ;
namespace  Proxy
{
    
/// <summary>
    
/// ImageProxy 图片代理类
    
/// </summary>

    public class ImageProxy     {
        
private bool done;
        
private Timer timer;
        
//-----
        public ImageProxy()         {
               ///使用了一个计时器,5秒钟
            timer 
= new Timer (new TimerCallback (timerCall), this50000);
        }

        
//-----
        private void timerCall(object obj) {
            done 
= true;
            timer.Dispose ();
        }

        
//-----
        public Image getImage() {
            Imager img;  
///继承了一个Imager类的接口方法getImage()
            if (done)
                img 
= new FinalImage ();
            
else
                img 
= new QuickImage ();
            
return img.getImage ();
        }

    }

}

 

QuickImage.cs
using  System;
using  System.Drawing ;
namespace  Proxy
{
    
/// <summary>
    
/// 如果ImageProxy的计时器缓冲时间未到,就返回一个正在加载的图片
    
/// </summary>

    public class QuickImage : Imager     {
        
public QuickImage()    {}
        
public Image getImage() {
            
return new Bitmap ("Box.gif");
        }

    }

}

 

FinalImage.cs
using  System;
using  System.Drawing ;
namespace  Proxy
{
    
/// <summary>
    
/// 如果5秒缓冲时间到了,就显示加载好了的图片
    
/// </summary>

    public class FinalImage :Imager {
        
public FinalImage()    {}
        
public Image getImage() {
            
return new Bitmap("flowrtree.jpg");
        }

    }

}

源代码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值