Design Patterns C#

using System;
public delegate void ChangedEventHandler(object sender, EventArgs e);
public class Subject {
    private string data;
    public event ChangedEventHandler Changed;
    public string Data {
        get { return data; }
        set {
            data = value;
            this.OnChanged(EventArgs.Empty);
        }
    }
    protected virtual void OnChanged(EventArgs e) {
        if (Changed != null)
            this.Changed(this, e);
    }
    public Subject() { }
}
public class Observer {
    private Subject data;
    private string observerName;
    public Subject ObservedObject {
        get { return data; }
        set { data = value; }
    }
    private void DataChanged(object sender, EventArgs e) {
        Console.WriteLine("Notification to {0}, {1}", observerName, data.Data);
    }
    public void Attach() {
        data.Changed += new ChangedEventHandler(DataChanged);
    }
    public void Detach() {
        data.Changed -= new ChangedEventHandler(DataChanged);
    }
    public Observer(string name) {
        observerName = name;
    }
}
class Client {
    static void Main(string[] args) {
        Subject sub = new Subject();
        Observer observerA = new Observer("A Observer");
        Observer observerB = new Observer("B Observer");
        observerA.ObservedObject = sub;
        observerB.ObservedObject = sub;
        observerA.Attach();
        observerB.Attach();
        sub.Data = "1";
        observerA.Detach();
        sub.Data = "2";
    }
}