此主題相關圖片如下:
此主題相關圖片如下:
using System;
//Delegate
delegate void UpdateDelegate();
//Subject
class Subject
{
public event UpdateDelegate UpdateHandler;
// Methods
public void Attach( UpdateDelegate ud )
{
UpdateHandler += ud;
}
public void Detach( UpdateDelegate ud )
{
UpdateHandler -= ud;
}
public void Notify()
{
if(UpdateHandler != null) UpdateHandler();
}
}
//ConcreteSubject
class ConcreteSubject : Subject
{
// Fields
private string subjectState;
// Properties
public string SubjectState
{
get{ return subjectState; }
set{ subjectState = value; }
}
}
// "ConcreteObserver"
class ConcreteObserver
{
// Fields
private string name;
private string observerState;
private ConcreteSubject subject;
// Constructors
public ConcreteObserver( ConcreteSubject subject,
string name )
{
this.subject = subject;
this.name = name;
}
// Methods
public void Update()
{
observerState = subject.SubjectState;
Console.WriteLine( "Observer {0}'s new state is {1}",
name, observerState );
}
// Properties
public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}
}
// "ConcreteObserver"
class AnotherObserver
{
// Methods
public void Show()
{
Console.WriteLine("AnotherObserver got an Notification!");
}
}
public class Client
{
public static void Main(string[] args)
{
ConcreteSubject s = new ConcreteSubject();
ConcreteObserver o1 = new ConcreteObserver(s, "1");
ConcreteObserver o2 = new ConcreteObserver(s, "2");
AnotherObserver o3 = new AnotherObserver();
s.Attach(new UpdateDelegate(o1.Update));
s.Attach(new UpdateDelegate(o2.Update));
s.Attach(new UpdateDelegate(o3.Show));
s.SubjectState = "ABC";
s.Notify();
Console.WriteLine("--------------------------");
s.Detach(new UpdateDelegate(o1.Update));
s.SubjectState = "DEF";
s.Notify();
}
}
{
UpdateHandler += ud;
}
s.Attach(new UpdateDelegate(o2.Update));
s.Attach(new UpdateDelegate(o3.Show));
{
if(UpdateHandler != null) UpdateHandler();
}
ConcreteObserver o1 = new ConcreteObserver(s, "1");
ConcreteObserver o2 = new ConcreteObserver(s, "2");
AnotherObserver o3 = new AnotherObserver();
s.Attach(new UpdateDelegate(o1.Update));
s.Attach(new UpdateDelegate(o2.Update));
s.Attach(new UpdateDelegate(o3.Show));
下面我就隨便談談觀察者模式的背景、意圖、適用範圍、優點、缺點...
還是舉個列子
A類
Class A
{
function funA()
{
}
}
B類
Class B
{
function funB()
{
}
}
C類
Class C
{
function funC()
{
A.funA();
B.funB();
}
}
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新。(摘自新版設計模式手冊[C#].pdf)
觀察者模式的討論先告一段落,主要還要在實踐中慢慢體會.
1.在分層設計中,同層類的交互,就是橫向調用比如在Bussiness層,如果有當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新的,我們可以嘗試觀察者模式,從而降低類之間的耦合性,我
寫的例子是一種強耦合的,一定程度上講破壞了類的高內聚低耦合及封閉原則.
2.C#編程中Delegate-Event就是很好的觀察者模式原形,我們要多用它.
以下摘自C#設計模式一書,講的蠻好:
觀察者模式的效果有以下幾個優點: