咨询热线:
024-88614238
最新动态
相关新闻
Observer pattern 观察者模式
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

观察者模式这个名字很形象,一个观察者observer,一个被观察者subject,然后是固定的操作——模式,合起来就是“观察者模式”了,呵呵。

那么观察者和被观察者有什么固定的操作呢?这里要注意了,虽然名字叫观察者模式,但我们却要从被观察者的角度来看这个问题。因为被观察者总是一个,而观察者我们不能肯定有多少,也就是说在这个模式里,被观察者比较稳定,所以我们用他来做分析的基础。

对于一个被观察者来说,他并不需要关心太多观察者的细节,只要他的动作能被他的观察者知道就行了,由此我们可以肯定观察者只要有一个接受的方法就可以了,他怎么接受被观察者就不用管了,因此我们可以用一个接口来表示观察者。
Observer <wbr>pattern <wbr>观察者模式(转)pulic interfase IObserver
Observer <wbr>pattern <wbr>观察者模式(转)
{
Observer <wbr>pattern <wbr>观察者模式(转)
    
void Receive(Message message);
Observer <wbr>pattern <wbr>观察者模式(转)
}
说明:首先,接口的名字、方法的名字是什么都可以。其次是参数,我觉得如果使用接口来表达观察者的话,参数是必不可少的,参数可以是自定义的类型,当然如果基本类型可以表达就不用自定义了。

再来看被观察者,他要做的事就比较多了,要维护一个观察者列表,就是决定让谁看不让谁看,然后就是做了动作之后通知观察者,由于所有的被观察者都要做这些类似的工作,我们用一个抽象类来表示。
Observer <wbr>pattern <wbr>观察者模式(转)public abstract class Subject
Observer <wbr>pattern <wbr>观察者模式(转)
{
Observer <wbr>pattern <wbr>观察者模式(转)
    
protected ArrayList<IObserver> observers = new ArrayList<IObserver>();
Observer <wbr>pattern <wbr>观察者模式(转)

Observer <wbr>pattern <wbr>观察者模式(转)    public void SendMessage(Message message)
Observer <wbr>pattern <wbr>观察者模式(转)
    {
Observer <wbr>pattern <wbr>观察者模式(转)
        
foreach (IObserver observer in observers)
Observer <wbr>pattern <wbr>观察者模式(转)
        {
Observer <wbr>pattern <wbr>观察者模式(转)
            observer.Receive(message);
Observer <wbr>pattern <wbr>观察者模式(转)
        }
Observer <wbr>pattern <wbr>观察者模式(转)
    }
Observer <wbr>pattern <wbr>观察者模式(转)

Observer <wbr>pattern <wbr>观察者模式(转)    public void AddObserver(IObserver observer)
Observer <wbr>pattern <wbr>观察者模式(转)
    {
Observer <wbr>pattern <wbr>观察者模式(转)
        observers.Add(observer);
Observer <wbr>pattern <wbr>观察者模式(转)
    }
Observer <wbr>pattern <wbr>观察者模式(转)

Observer <wbr>pattern <wbr>观察者模式(转)    public void RemoveObserver(IObserver observer)
Observer <wbr>pattern <wbr>观察者模式(转)
    {
Observer <wbr>pattern <wbr>观察者模式(转)
        observers.Remove(observer);
Observer <wbr>pattern <wbr>观察者模式(转)
    }
Observer <wbr>pattern <wbr>观察者模式(转)
}

说明:同样,类的名字、方法的名字也是什么都可以。其次我们要一个约束,就是有观察能力的我们才认为他是个观察者,在代码里体现为实现了IObserver接口的类。

对于不同的观察者来说,他们关心的信息以及对信息的处理是不同的,因此在这个模式中还有一个实际的观察者(接口表达的观察者只是一个很泛的概念,具体到某个类,才是一个有效的观察者。)
Observer <wbr>pattern <wbr>观察者模式(转)public class Observer IObserver
Observer <wbr>pattern <wbr>观察者模式(转)

Observer <wbr>pattern <wbr>观察者模式(转)
    
// Observer <wbr>pattern <wbr>观察者模式(转)..
Observer <wbr>pattern <wbr>观察者模式(转)

Observer <wbr>pattern <wbr>观察者模式(转)
    public void Receive(Message message)
Observer <wbr>pattern <wbr>观察者模式(转)
    
Observer <wbr>pattern <wbr>观察者模式(转)
        
//Observer <wbr>pattern <wbr>观察者模式(转)..
Observer <wbr>pattern <wbr>观察者模式(转)
    }
Observer <wbr>pattern <wbr>观察者模式(转)
}

 

同样,还有个具体的被观察者

Observer <wbr>pattern <wbr>观察者模式(转)public class ConcreteSubject Subject
Observer <wbr>pattern <wbr>观察者模式(转)
{
Observer <wbr>pattern <wbr>观察者模式(转)    
public void Action()
Observer <wbr>pattern <wbr>观察者模式(转)    

Observer <wbr>pattern <wbr>观察者模式(转)        
//Observer <wbr>pattern <wbr>观察者模式(转)Observer <wbr>pattern <wbr>观察者模式(转)
Observer <wbr>pattern <wbr>观察者模式(转)

Observer <wbr>pattern <wbr>观察者模式(转)        Message message 
= new Message();
Observer <wbr>pattern <wbr>观察者模式(转)
Observer <wbr>pattern <wbr>观察者模式(转)        
//Observer <wbr>pattern <wbr>观察者模式(转)..
Observer <wbr>pattern <wbr>观察者模式(转)

Observer <wbr>pattern <wbr>观察者模式(转)        SendMessage(message);
Observer <wbr>pattern <wbr>观察者模式(转)    }

Observer <wbr>pattern <wbr>观察者模式(转)}


前面的准备工作做好了,实际应用就很简单了,根据需要生成不同的观察者,然后添加到被观察者的观察者列表中,然后被观察者做动作,把相关信息通知给观察者,每个观察者在根据信息做自己的处理。

沈阳网络公司招聘

联系方式
地址:沈阳市东陵区
万柳塘路109甲1宏发 大厦525室
电话:024-24804848
8748636
15317796
102656105

友情链接(联系QQ:8748636) 沈阳网站制作| 沈阳网站制作| 沈阳SEO公司| 沈阳主机托管| 沈阳网络公司| 沈阳网站制作| 沈阳网站建设|
地址:沈阳市沈河区万柳塘路36-1 弘锦大厦412室 经理QQ:8748636 技术QQ:30999233 联系电话:024-88614238
Copyright? 2005-2013,沈阳海风网络科技有限公司 All Right Reserved. 版权所有 辽ICP备05004358号
【海风数据港】是专业沈阳服务器托管、沈阳网站制作、沈阳网站优化、沈阳网站建设的沈阳网络公司