溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java觀察者模式實(shí)例分析

發(fā)布時(shí)間:2022-02-19 12:58:27 來(lái)源:億速云 閱讀:429 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Java觀察者模式實(shí)例分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java觀察者模式實(shí)例分析”吧!

Java觀察者模式實(shí)例分析

使用場(chǎng)景

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

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

一個(gè)抽象模型有兩方面,其中一方面依賴于另一方面,這時(shí)用觀察者模式可以將這兩者封裝在獨(dú)立的對(duì)象中使得他們各自獨(dú)立地改變和復(fù)用。

舉例

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 = "老板我胡漢三回來(lái)了";
boss.Notify();

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

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);

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

newBoss.Update -= stockObserver.Update;

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

從上面這個(gè)示例可以看到,通過(guò)事件的方式,我們可以不要求顯示繼承于 Observer 這個(gè)抽象類,可以更加靈活,擴(kuò)展性更強(qiáng),這也是很多類庫(kù)中會(huì)使用事件來(lái)擴(kuò)展的重要原因

More

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

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

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

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

感謝各位的閱讀,以上就是“Java觀察者模式實(shí)例分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java觀察者模式實(shí)例分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI