设计模式系列漫谈之九 - 代理模式

继续小雪的故事···

故事
       小雪现就职于一家专门销售夏装的服装公司,小雪负责美国市场的销售业务。在过去的几个月里,由于公司的产品销售异常火爆,小雪不得不每天都奔跑在中国和美国两地。有时候,今天还在中国,一觉醒来就到了美国纽约。GPRS 手机确实给小雪带来免去了不少烦恼,因为每到一个新的地方,手机就会自动给这些痴情的追求者问好,并告知所在位置。

      众所周知,很多商品都有销售淡季,家纺夏天是淡季,啤酒冬天是淡季,蚊香冬春是淡季,空调春秋是淡季,夏装冬天是淡季,冬装夏天是淡季。近来,美国的气温开始下降。公司的产品销售量慢慢减少。小雪已经很长时间没有出差了。

      突然有一天,有几个追求者打来电话问:“小雪,这段时间忙什么呢,这么长时间都没来短信。” 接下来的几天里,小雪接到了很多类似的电话。原来,小雪一直在公司上班,手机已经很长时间没有给他们发信息了。小雪想,我长时间不出差,是否一个功能 我每5个小时自动发出预先设置的默认短信呢?

代理模式(Proxy)的解决方案
      GOF在《设计模式》中如此描述:为对象提供一种代理,以控制对对象的访问。代理模式需要定义三个角色:抽象对象、真实对象、代理对象。
 
以下是在本系列观察者模式基础上通过代理模式实现。请参见: 设计模式系列漫谈之一 - 观察者模式

抽象对象如下:
namespace  XiaoXue
{
    
public   abstract  clas  Boy
    {
        
public   bool  Moved = false ;
        
public   string  Address;
        
public   virtual   void  ShowAddress()
         {
               Console.WriteLine(
this .Address);
         }
    }
真实对象如下:
namespace  XiaoXue
{
    
public   class  BoyA : Boy
    {
         
public   override   void  ShowAddress()
        {
               boy.ShowAddress();
        }
    }

   
public   class  BoyB : Boy
    {
         
public   override   void  ShowAddress()
        {
               boy.ShowAddress();
        }
    }
}

代理对象如下:
namespace  XiaoXue
{
    
public   class  ProxyBoyA : Boy
    {
           
private  BoyA boy = null ;
           
public  ProxyBoyA(IBoy b)
            {
                  boy
= b;
            }

           
public   override   void  ShowAddress()
           {
               
if  (boy.Moved)
               {
                      boy.ShowAddress();
               }
               
else
                {
                      
base .ShowAddress();
               }
           }
    }

     
public   class  ProxyBoyB : Boy
    {
           
private  BoyB boy = null ;
           
public  ProxyBoyB(IBoy b)
            {
                  boy
= b;
            }

           
public   override   void  ShowAddress()
           {
               
if  (boy.Moved)
               {
                      boy.ShowAddress();
               }
               
else
                {
                      
base .ShowAddress();
               }
           }
    }
}

被观察者对象如下:
namespace  XiaoXue
{
    
public   class  GPRSMobile
    {
        
private  ArrayList boys  =   new  ArrayList();  // 观察者列表
         private   string  _DefaultAddress;

        
public  GPRSMobile( string  defaultAddress)
        {
                 
this ._DefaultAddress = defaultAddress;

                 timer
= new  System.Timers..Timer();
                 timer.Interval
= 5 * 60 * 60 * 1000 ;
                 timer.Enabled
= true ;
                 timer.Elapsed 
+=   new  System.Timers.ElapsedEventHandler(timer_Elapsed);
        }

         
void  timer_Elapsed( object  sender, System.Timers.ElapsedEventArgs e)
          {
                Notify(
this ._DefaultAddress, false );
          }

        
public   void  AddBoy(Boy b)
         {
              boys.Add(b);
         }

        
// 通知所有观察者 
        private   void  Notify( string  address, bool  moved)
        {
            
for  ( int  i  =   0 ; i  <  boys.Count; i ++ )
            {
                 Boy boy
= (Boy)boys[i];
                 boy.Moved
= moved;
                 boy.Address
= address;

                 boy.ShowAddress();
            }
        }
        
// 当位置发生变化时执行
         public   void  OnAddressChanaged( string  newAddress)
        {
             Notify(newAddress,
true );
        }
    }
}
客户端调用如下:
BoyA boya = new  BoyA();
BoyB boyb
= new  BoyB();

GPRSMobile mobile
= new  GRPSMobile( " 正在公司上班呢 " )
mobile.AddBoy(boya);
mobile.AddBoy(boyb);

GPRS手机一旦监测所在位置发生变化,立即调用OnAddressChanaged方法发送信息
mobile.OnAddressChanaged("小雪在纽约向你问好!");

转载于:https://www.cnblogs.com/ruochen/archive/2007/12/22/1010571.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值