[JavaScrip和C#两种语言]实现观察者模式
实现观察者模式的过程
实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。下面的三个图详细的描述了这样一种过程:1、观察者
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。2、被观察对象
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。3、撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。 观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观 察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化 的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<script type="text/javascript">
var Observer=function (){
this.Response=function(){
document.writeln(this.name+"跑了;");
}
}
var Subject=function (){
this.list=new Array();
this.Aimat=function(obs){
this.list.push(obs);
}
}
var Mouse=function (name,sub){
Observer.call(this);
this.name=name;
sub.Aimat(this);
}
var Cat=function (){
Subject.call(this);
this.cry=function(){
for(var i=0;i<this.list.length;i++)
{
this.list[i].Response();
}
}
}
function test()
{
var cat=new Cat();
var mouse1=new Mouse("老鼠1",cat);
var mouse2=new Mouse("老鼠2",cat);
cat.cry();
}
</script>
</head>
<body>
<input type="button" value="测试" onclick="test()" />
</body>
</html>
C#实现,为方便扩展,添加了一个事件。
public interface Observer
{
void Response();//观察者的响应
}
public interface Subject
{
void AimAt(Observer obs);//针对哪些观察者
}
public delegate void delResponse();
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject subj)
{
this.name = name;
subj.AimAt(this);
}
public event delResponse OnResponse;
public void Response()
{
if (OnResponse == null)
{
Console.WriteLine(name + ":跑了");
}
else
{
OnResponse();
}
}
}
public class Cat : Subject
{
private List<Observer> observers;
public Cat()
{
this.observers = new List<Observer>();
}
public void AimAt(Observer obs)
{
this.observers.Add(obs);
}
public void Cry()
{
Console.WriteLine("Cat 叫了!");
foreach (Observer obs in this.observers)
{
obs.Response();
}
}
}