using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
//观察者模式 1,抽象主题(要观察的东东)2,实现主题 3,抽象观察者 4,实现观察者
//抽象主题要实现的功能:添加及删除观察者,主题变化了,要通知观察者
public abstract class subject //抽象类可以共存抽象方法与非抽象方法
{
private ArrayList bservers = new ArrayList();//存储观察者集合
public void add(observer observer)
{
observers.Add(observer);
}
public void delete(observer observer)
{
observers.Remove(observer);
}
//主题发生变化要通知观察者
public void notify()
{
foreach (observer obs in observers)
//最终通过调用观察者update方法实现通知观察者,主题发生了变化
obs.update();
}
}
public class concretesubject : subject
{
//在具体的主题中添加具体的主题信息吧
private string subjectstatus;
public string Subjectstatus
{
get
{
return subjectstatus;
}
set
{
subjectstatus = value;
}
}
}
public abstract class observer
{
public abstract void update();//具体的通知在子类实现
}
public class concreteobserver : observer
{
//观察者要知道观察哪些主题吧
private string name;//观察者名字
private string observerstatus;//存储主题的变化数据
private concretesubject sub;
public concreteobserver(concretesubject sub, string name)
{
this.sub = sub;
this.name = name;
}
//观察者中实现更新方法,用于接收主题的变化数据
public override void update()
{
bserverstatus = this.sub.Subjectstatus;
Console.WriteLine("观察者{0}的新状态是:{1}", name, observerstatus);
}
}
//客户端
class Program
{
static void Main(string[] args)
{
//在客户调调用观察者模式
//实例化一个真实主题
concretesubject conc = new concretesubject();
conc.Subjectstatus = "111";
//在真实主题添加多个观察者
concreteobserver obj1 = new concreteobserver(conc, "翟勋杨");
conc.add(obj1);
//observer obj2 = new concreteobserver(conc, "翟勋章");
//conc.add(obj2);
conc.notify();
Console.ReadKey();
}
}
}
后记:
public concreteobserver(concretesubject sub, string name)
{
this.sub = sub;
this.name = name;
}
上述代码一定要加this,不然会导致sub没有初始化值,或者采用全局与局部变量区别命名的方法来实现.
小结:1,局部变量与全局变量的命名一定要规范
2,仅看代码差太远,一定要编写,起码把人家的代码敲写一次也是大有裨益