观察者模式可以用来同时以多种方式表示数据。我们可能有一组数据,然后希望同时在用户界面用多种表示方式显示这组数据,比如用表格和绘图的两种方式。并且当数据发生变化的时候我们希望数据的显示能够自动的更新,这就需要我们使用观察者模式。
观察者模式假设包含数据的对象与显示的对象是分离的,显示对象就需要观察数据中的变化。
在实现观察者模式的时候,我们通常把数据成为主题(Subject),把每种显示方式成为观察者(Observer).
观察者都有一个为其他对象所知的接口,这样当数据放生变化的时候主题就可以通过调用这个接口告知观察者数据的变化。
观察者统一的接口定义为:
using System;
namespace Observer
{
/// <summary>
/// Summary description for Observer.
/// </summary>
public interface Observer {
void sendNotify(string message);
}
}
主题的接口:
using System;
namespace Observer
{
/// <summary>
/// Summary description for Subject.
/// </summary>
public interface Subject {
void registerInterest(Observer obs);
}
}
我们的一个简单例子,在主程序面板中有三个颜色选择按钮,单击一个按钮在另外两个面板中会显示对应的颜色文字和对应的颜色。这样就需要两个显示面板作为观察者观察主面板这个主题中的数据的变化。
程序的截图如下:
这样,主窗口在这里就是我们的主题,主题的定义如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace Observer
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form, Subject
{
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.RadioButton opRed;
private System.Windows.Forms.RadioButton opGreen;
private System.Windows.Forms.RadioButton opBlue;
private ArrayList observers;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
init();
}
private void init() {
EventHandler evh = new EventHandler (opButton_Click);
opRed.Click += evh;
opBlue.Click += evh;
opGreen.Click += evh;
observers = new ArrayList ();
ListObs lobs =