日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
講解一下觀察者模式

觀察者模式 是一種非常經(jīng)典 非常常用的設(shè)計模式。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、玄武ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的玄武網(wǎng)站制作公司

一個對象的行為 依賴于 另一個對象的狀態(tài)?;蛘邠Q一種說法,當被觀察對象(目標對象)的狀態(tài)發(fā)生改變時 ,會直接影響到觀察對象的行為。

特點一 : 被觀察者 和觀察者 一般是 一對多的關(guān)系,一個被觀察者 對應(yīng)多個觀察者,當一個被觀察者的狀態(tài)發(fā)生改變時,被觀察者通知觀察者, 然后可以在觀察者內(nèi)部 進行業(yè)務(wù)邏輯的處理。

使用場景

觀察者模式所做的工作其實就是在解耦,讓耦合的雙方都依賴于抽象而不是具體,從而使得各自的變化都不會影響另一邊的變化。

當一個對象的改變需要改變其他對象的時候,而且它不知道具體有多少對象有待改變的時候,應(yīng)該考慮使用觀察者模式。

一個抽象模型有兩方面,其中一方面依賴于另一方面,這時用觀察者模式可以將這兩者封裝在獨立的對象中使得他們各自獨立地改變和復用。

舉例

public interface ISubject
{
   void Notify();

   string SubjectState { get; set; }
}
public class Boss : ISubject
{
   private readonly IList _observers = new List();

   public void Attach(Observer observer)
   {
       _observers.Add(observer);
   }

   public void Detach(Observer observer)
   {
       _observers.Remove(observer);
   }

   public void Notify()
   {
       foreach (var observer in _observers)
       {
           observer.Update();
       }
   }

   public string SubjectState { get; set; }
}

public abstract class Observer
{
   protected string Name;
   protected ISubject Subject;

   protected Observer(string name, ISubject subject)
   {
       Name = name;
       Subject = subject;
   }

   public abstract void Update();
}
public class StockObserver : Observer
{
   public StockObserver(string name, ISubject subject) : base(name, subject)
   {
   }

   public override void Update()
   {
       Console.WriteLine($"{Name} {Subject.SubjectState} 關(guān)閉股票行情,繼續(xù)工作");
   }
}
public class NBAObserver : Observer
{
   public NBAObserver(string name, ISubject subject) : base(name, subject)
   {
   }

   public override void Update()
   {
       Console.WriteLine($"{Name} {Subject.SubjectState} 關(guān)閉 NBA 直播,繼續(xù)工作");
   }
}


var boss = new Boss();
var stockObserver = new StockObserver("魏關(guān)姹", boss);
var nbaObserver = new NBAObserver("易管查", boss);

boss.Attach(stockObserver);
boss.Attach(nbaObserver);

boss.Detach(stockObserver);

boss.SubjectState = "老板我胡漢三回來了";
boss.Notify();

借助 event(委托) 我們可以實現(xiàn)可以靈活的觀察者模式,我們定義了一個新老板來演示事件的方式,來看下面的示例:

public class NewBoss : ISubject
{
   public event Action Update;

   public void Notify()
   {
       Update?.Invoke();
   }

   public string SubjectState { get; set; }
}

public class GamePlayerObserver
{
   private readonly string _name;
   private readonly ISubject _subject;

   public GamePlayerObserver(string name, ISubject subject)
   {
       _name = name;
       _subject = subject;
   }

   public void CloseGame()
   {
       Console.WriteLine($"{_name} {_subject.SubjectState} 關(guān)閉 LOL 游戲,繼續(xù)工作");
   }
}

var newBoss = new NewBoss();
var stockObserver = new StockObserver("魏關(guān)姹", boss);
var nbaObserver = new NBAObserver("易管查", boss);
var gameObserver = new GamePlayerObserver("西門", newBoss);

// 注冊通知事件
newBoss.Update += stockObserver.Update;
newBoss.Update += nbaObserver.Update;
newBoss.Update += gameObserver.CloseGame;

newBoss.Update -= stockObserver.Update;

newBoss.SubjectState = "老板我胡漢三回來了";
newBoss.Notify();

從上面這個示例可以看到,通過事件的方式,我們可以不要求顯示繼承于 Observer 這個抽象類,可以更加靈活,擴展性更強,這也是很多類庫中會使用事件來擴展的重要原因

More

設(shè)計模式要干的事情就是解耦。創(chuàng)建型模式是將創(chuàng)建和使用代碼解耦,結(jié)構(gòu)型模式是將不同功能代碼解耦,行為型模式是將不同的行為代碼解耦,具體到觀察者模式,它是將觀察者和被觀察者代碼解耦。

根據(jù)應(yīng)用場景的不同,觀察者模式會對應(yīng)不同的代碼實現(xiàn)方式:有同步阻塞的實現(xiàn)方式,也有異步非阻塞的實現(xiàn)方式;有進程內(nèi)的實現(xiàn)方式,也有跨進程的實現(xiàn)方式。

在對象之間定義一個一對多的依賴,當一個對象狀態(tài)改變的時候,所有依賴的對象都會自動收到通知。一般情況下,被依賴的對象叫作被觀察者(Observable),依賴的對象叫作觀察者(Observer)。不過,在實際的項目開發(fā)中,這兩種對象的稱呼是比較靈活的,有各種不同的叫法,比如:Subject-Observer、Publisher-Subscriber、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。不管怎么稱呼,只要應(yīng)用場景符合剛剛給出的定義,都可以看作觀察者模式。

EventBus(事件總線) 就是一個觀察者模式的實際應(yīng)用。


當前文章:講解一下觀察者模式
網(wǎng)站地址:http://www.dlmjj.cn/article/ccoshgc.html