此文为转载,地址: http://yuyijq.cnblogs.com/

故事

小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出。男孩们追求女孩时总是表现120%的关心,当小雪私自游玩时总是不断收到追求者询问小雪位置变动的消息,小雪也不胜其烦,但小雪是如此的一个善良的女孩,她总是打断自己正常的生活回复男孩们的消息。而男孩们由于要不断的关心小雪的位置变化也弄的精疲力竭,而且还影响正常的工作。

小雪和男孩们的烦恼:

男孩们必须不断的询问小雪的位置变化,从而打断正常的工作小雪也要不断的接受男孩们的询问,有的时候小雪的位置并没有发生变化,还是要不断的回复男孩们的询问。如果给各个男孩们回复问题的方式都不尽相同,小雪还要知道不同的回复方式。

    我们给小雪和男孩们提出了解决方案: 
     
      建议小雪购买一款带有GPRS功能的手机,该手机保存着所有追求者的电话号码,当该手机检测到小雪的位置发生变化时, 就会向所有追求者通知所在位置。这样一来,男孩们和小雪都各自都可以按照自己正常的生活习惯,只有小雪所在位置发生变化时候才会进行通信。

观察者模式(Observer)的解决方案

    观察者模式的思想:观察者模式定义了被观察者与观察者对象之间一对多关系,当被观察者对象的状态发生改变时,多个观察者对象就会接受到通知。 

 观察者接口如下:

namespace XiaoXue
{
    
public interface IObserver
    {
        
void ShowAddress(string address);
    }
}

观察者类如下:

namespace XiaoXue
{
    
public class BoyA : IObserver
    {
        
public void ShowAddress(string address)
        {
            Console.WriteLine(
"小雪所在位置:" + address);
        }
    }
    
public class BoyB : IObserver
    {
        
public void ShowAddress(string address)
        {
            Console.WriteLine(
"小雪所在位置:" + address);
        }
    }
}

被观察者类如下:

namespace XiaoXue
{
    
public class GPRSMobile
    {
        
private ArrayList boys = new ArrayList(); //观察者列表 
        public GPRSMobile()
        {
            
        }
        
public void AddBoy(IObserver b)
         {
              boys.Add(b);
         }
        
//通知所有观察者 
       private void Notify(string address)
        {
            
for (int i = 0; i < boys.Count; i++)
            {
                 IObserver boy
=(IObserver)boys[i];
                 boy.ShowAddress(address);
            }
        }
        
//当位置发生变化时执行
        public void OnAddressChanaged(string newAddress)
        {
            Notify(newAddress);
        }
    }
}


客户端调用如下:

BoyA boya=new BoyA();
BoyB boyb
=new BoyB();

GPRSMobile mobile
=new GRPSMobile()
mobile.AddBoy(boya);
mobile.AddBoy(boyb);

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

posted on 2007-12-16 17:52 李华星 阅读(472) 评论(5)  编辑 收藏 所属分类: 设计模式

  回复  引用  查看    
2007-12-25 17:52 | 颜昌钢      
您好.
看了您的文章,感觉非常的通俗易懂,并且能够让人在开心一笑的情况下,记住所讲的内容.

我有个疑问:
按照您文章这样的做法,
需要在被观察者哪儿注册一个观察者.及 在美女的手机中保存帅哥们的号码
而为什么不是在观察者哪儿注册被观察者呢? 及 在每个帅哥哪儿 注册美女信息呢?

那如果 今天这个帅哥喜欢这个美女,明天却喜欢上了别的美女,呵呵,同样的,他还要观察美女的位置?按您这样,在原来美女哪儿,她的位置的变化,还是要通知到该帅哥的.

我有一遍http://www.cnblogs.com/yanchanggang/archive/2007/12/17/1002938.html
不知道是不是以前看过您写的文章后,写的,呵呵,反正也是追美女的过程.
呵呵,您能帮忙指点下么?
向您学习.
  回复  引用  查看    
2007-12-26 09:18 | 李华星      
首先,我想申明的是,这个故事是只是为了说明观察者模式使用场景而编。 从现实的角度来讲,根本就不可能发生的事情。要真有这么一个美女会把自己每天的行踪都告诉别人, 我觉得她有毛病。

其次,观察者模式就是为了解决被观察者与观察者对象之间的一对多关系, 当某一对象发生变化, 与之相关的对象立即收到通知。所以如果对象之间只是一对一关系, 我认为没必要用观察者模式
  回复  引用  查看    
2008-01-09 13:09 | 横刀天笑      
LZ,这个故事可是我的原创哦,也不加个转载连接。
不过LZ将其发扬光大了,呵呵
  回复  引用  查看    
2008-01-09 15:02 | 李华星      
@横刀天笑
哦, 确实你的作品, 谢谢
  回复  引用  查看    
2008-06-27 23:36 | Bēniaǒ      
有点意思,和我的那篇《谈爱情故事,谈观察者模式》差不多,有兴趣可以看看
http://www.cnblogs.com/beniao/archive/2008/05/25/1206608.html