您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java觀察者模式實例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java觀察者模式實例分析”吧!
觀察者模式所做的工作其實就是在解耦,讓耦合的雙方都依賴于抽象而不是具體,從而使得各自的變化都不會影響另一邊的變化。
當一個對象的改變需要改變其他對象的時候,而且它不知道具體有多少對象有待改變的時候,應該考慮使用觀察者模式。
一個抽象模型有兩方面,其中一方面依賴于另一方面,這時用觀察者模式可以將這兩者封裝在獨立的對象中使得他們各自獨立地改變和復用。
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} 關閉股票行情,繼續工作"); } } public class NBAObserver : Observer { public NBAObserver(string name, ISubject subject) : base(name, subject) { } public override void Update() { Console.WriteLine($"{Name} {Subject.SubjectState} 關閉 NBA 直播,繼續工作"); } } var boss = new Boss(); var stockObserver = new StockObserver("魏關姹", boss); var nbaObserver = new NBAObserver("易管查", boss); boss.Attach(stockObserver); boss.Attach(nbaObserver); boss.Detach(stockObserver); boss.SubjectState = "老板我胡漢三回來了"; boss.Notify();
借助 event(委托) 我們可以實現可以靈活的觀察者模式,我們定義了一個新老板來演示事件的方式,來看下面的示例:
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} 關閉 LOL 游戲,繼續工作"); } } var newBoss = new NewBoss(); var stockObserver = new StockObserver("魏關姹", 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 這個抽象類,可以更加靈活,擴展性更強,這也是很多類庫中會使用事件來擴展的重要原因
設計模式要干的事情就是解耦。創建型模式是將創建和使用代碼解耦,結構型模式是將不同功能代碼解耦,行為型模式是將不同的行為代碼解耦,具體到觀察者模式,它是將觀察者和被觀察者代碼解耦。
根據應用場景的不同,觀察者模式會對應不同的代碼實現方式:有同步阻塞的實現方式,也有異步非阻塞的實現方式;有進程內的實現方式,也有跨進程的實現方式。
在對象之間定義一個一對多的依賴,當一個對象狀態改變的時候,所有依賴的對象都會自動收到通知。一般情況下,被依賴的對象叫作被觀察者(Observable),依賴的對象叫作觀察者(Observer)。不過,在實際的項目開發中,這兩種對象的稱呼是比較靈活的,有各種不同的叫法,比如:Subject-Observer、Publisher-Subscriber、Producer-Consumer、EventEmitter-EventListener、Dispatcher-Listener。不管怎么稱呼,只要應用場景符合剛剛給出的定義,都可以看作觀察者模式。
EventBus(事件總線) 就是一個觀察者模式的實際應用。
感謝各位的閱讀,以上就是“Java觀察者模式實例分析”的內容了,經過本文的學習后,相信大家對Java觀察者模式實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。