結(jié)合項目實例 回顧傳統(tǒng)設(shè)計模式(二)觀察者模式
2011-10-02 13:43 熬夜的蟲子 閱讀(711) 評論(0) 收藏 舉報觀察者模式現(xiàn)在用的不是很多 重點看下它的設(shè)計思想 OK 下面繼續(xù) 消息中心的那點事
/// <summary>
/// 數(shù)據(jù)中心
/// </summary>
public class MessageData
{
public void messageSend()
{
string title = observer.getTitle();
string content = observer.getContent();
//針對具體實現(xiàn)編程,會導(dǎo)致我們以后再增加或者刪除消息平臺時 必須要重新維護Platformlist 有時甚至還要重構(gòu)代碼
foreach (Platform p in observer.Platformlist)
{
p.update(title, content);
}
}
}
/// 數(shù)據(jù)中心
/// </summary>
public class MessageData
{
public void messageSend()
{
string title = observer.getTitle();
string content = observer.getContent();
//針對具體實現(xiàn)編程,會導(dǎo)致我們以后再增加或者刪除消息平臺時 必須要重新維護Platformlist 有時甚至還要重構(gòu)代碼
foreach (Platform p in observer.Platformlist)
{
p.update(title, content);
}
}
}
上述情況在soa體系架構(gòu)中凸顯比較嚴重,基本上數(shù)據(jù)中心作為基站程序不適合版本經(jīng)常更新
那么這和一對多得關(guān)系有何關(guān)聯(lián)
利用觀察者模式,數(shù)據(jù)中心是具體狀態(tài)的對象,并且可以控制這些狀態(tài)。也就是說,有“一個”具有狀態(tài)的數(shù)據(jù)體。另一方面,觀察者模式使用這些狀態(tài),雖然這些狀態(tài)不屬于他們。有許多的觀察者,依賴主題來告訴他們狀態(tài)合適改變了。這就產(chǎn)生了一個關(guān)系:“一個”數(shù)據(jù)中心對于“多個”消息發(fā)布者的關(guān)系。
松耦合的威力:當(dāng)兩個對象松耦合,他們依然可以交互,但是不清楚彼此的細節(jié)。觀察者模式提供了一種對象設(shè)計,讓主題和觀察者之間松耦合。
/// <summary>
/// 數(shù)據(jù)中心
/// </summary>
public class MessageData : MessageDateIF
{
private ArrayList observers;
private string title;
private string content;
public MessageData()
{
observers = new ArrayList();
}
public void RegisterPlatform(observerIF o)
{
observers.Add(o);
}
public void RemovePlatform(observerIF o)
{
int i = observers.IndexOf(o);
if (i > 0) { observers.Remove(i); }
}
public void NotifyPlatform()
{
foreach (observerIF o in observers)
{
o.update(title, content);
}
}
public void MessageChanged(string title,string content)
{
this.title = title;
this.content = content;
NotifyPlatform();
}
}
public interface observerIF
{
void update(string title, string content);
}
public interface MessageDateIF
{
void RegisterPlatform(observerIF o);
void RemovePlatform(observerIF o);
void NotifyPlatform();
}
public interface DisplayElemnet
{
void Display();
}
public class PlatformA : observerIF, DisplayElemnet
{
private string title;
private string content;
private MessageDateIF messagedata;
public PlatformA(MessageDateIF messagedata)
{
this.messagedata = messagedata;
}
public void update(string title, string content)
{
this.title = title;
this.content = content;
Display();
}
public void Display()
{
Console.WriteLine("title:" + title + " content:" + content);
}
}
/// 數(shù)據(jù)中心
/// </summary>
public class MessageData : MessageDateIF
{
private ArrayList observers;
private string title;
private string content;
public MessageData()
{
observers = new ArrayList();
}
public void RegisterPlatform(observerIF o)
{
observers.Add(o);
}
public void RemovePlatform(observerIF o)
{
int i = observers.IndexOf(o);
if (i > 0) { observers.Remove(i); }
}
public void NotifyPlatform()
{
foreach (observerIF o in observers)
{
o.update(title, content);
}
}
public void MessageChanged(string title,string content)
{
this.title = title;
this.content = content;
NotifyPlatform();
}
}
public interface observerIF
{
void update(string title, string content);
}
public interface MessageDateIF
{
void RegisterPlatform(observerIF o);
void RemovePlatform(observerIF o);
void NotifyPlatform();
}
public interface DisplayElemnet
{
void Display();
}
public class PlatformA : observerIF, DisplayElemnet
{
private string title;
private string content;
private MessageDateIF messagedata;
public PlatformA(MessageDateIF messagedata)
{
this.messagedata = messagedata;
}
public void update(string title, string content)
{
this.title = title;
this.content = content;
Display();
}
public void Display()
{
Console.WriteLine("title:" + title + " content:" + content);
}
}
總結(jié):為了對象之間的松耦合而設(shè)計。觀察者模式定義了對象之間一對多依賴,這樣一來,當(dāng)一個對象改變狀態(tài)時,它的所有一攔著都會收到通知并自動更新
![]() |
原創(chuàng)作品允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |

浙公網(wǎng)安備 33010602011771號