网站建设如何不被忽悠,网站前端设计理念,企业商网如何建设,有关外贸的网站有哪些定义
观察者模式是一种行为设计模式#xff0c;它定义了对象之间的一对多依赖关系#xff0c;当一个对象的状态发生改变时#xff0c;所有依赖于它的对象都会得到通知并自动更新。观察者模式的核心在于解耦主题#xff08;被观察者#xff09;和观察者之间的依赖关系。
…定义
观察者模式是一种行为设计模式它定义了对象之间的一对多依赖关系当一个对象的状态发生改变时所有依赖于它的对象都会得到通知并自动更新。观察者模式的核心在于解耦主题被观察者和观察者之间的依赖关系。
正确写法
假设我们有一个天气预报系统当天气变化时需要通知多个订阅者如手机应用、网站等。
using System;
using System.Collections.Generic;// 被观察者接口
public interface ISubject
{void RegisterObserver(IObserver observer);void RemoveObserver(IObserver observer);void NotifyObservers();
}// 观察者接口
public interface IObserver
{void Update(string weatherInfo);
}// 具体被观察者
public class WeatherStation : ISubject
{private ListIObserver observers new ListIObserver();private string weatherInfo;public void SetWeatherInfo(string info){this.weatherInfo info;NotifyObservers();}public void RegisterObserver(IObserver observer){observers.Add(observer);}public void RemoveObserver(IObserver observer){observers.Remove(observer);}public void NotifyObservers(){foreach (var observer in observers){observer.Update(weatherInfo);}}
}// 具体观察者
public class MobileApp : IObserver
{public void Update(string weatherInfo){Console.WriteLine($Mobile App received: {weatherInfo});}
}public class Website : IObserver
{public void Update(string weatherInfo){Console.WriteLine($Website received: {weatherInfo});}
}// 客户端代码
class Program
{static void Main(string[] args){WeatherStation weatherStation new WeatherStation();IObserver mobileApp new MobileApp();IObserver website new Website();weatherStation.RegisterObserver(mobileApp);weatherStation.RegisterObserver(website);weatherStation.SetWeatherInfo(Sunny and warm);weatherStation.RemoveObserver(mobileApp);weatherStation.SetWeatherInfo(Cloudy with a chance of rain);}
}类图 #mermaid-svg-n4cz8nR4OqLJK9JC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-n4cz8nR4OqLJK9JC .error-icon{fill:#552222;}#mermaid-svg-n4cz8nR4OqLJK9JC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-n4cz8nR4OqLJK9JC .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-n4cz8nR4OqLJK9JC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-n4cz8nR4OqLJK9JC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-n4cz8nR4OqLJK9JC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-n4cz8nR4OqLJK9JC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-n4cz8nR4OqLJK9JC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-n4cz8nR4OqLJK9JC .marker.cross{stroke:#333333;}#mermaid-svg-n4cz8nR4OqLJK9JC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-n4cz8nR4OqLJK9JC g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-n4cz8nR4OqLJK9JC g.classGroup text .title{font-weight:bolder;}#mermaid-svg-n4cz8nR4OqLJK9JC .nodeLabel,#mermaid-svg-n4cz8nR4OqLJK9JC .edgeLabel{color:#131300;}#mermaid-svg-n4cz8nR4OqLJK9JC .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-n4cz8nR4OqLJK9JC .label text{fill:#131300;}#mermaid-svg-n4cz8nR4OqLJK9JC .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-n4cz8nR4OqLJK9JC .classTitle{font-weight:bolder;}#mermaid-svg-n4cz8nR4OqLJK9JC .node rect,#mermaid-svg-n4cz8nR4OqLJK9JC .node circle,#mermaid-svg-n4cz8nR4OqLJK9JC .node ellipse,#mermaid-svg-n4cz8nR4OqLJK9JC .node polygon,#mermaid-svg-n4cz8nR4OqLJK9JC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-n4cz8nR4OqLJK9JC .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-n4cz8nR4OqLJK9JC g.clickable{cursor:pointer;}#mermaid-svg-n4cz8nR4OqLJK9JC g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-n4cz8nR4OqLJK9JC g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-n4cz8nR4OqLJK9JC .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-n4cz8nR4OqLJK9JC .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-n4cz8nR4OqLJK9JC .dashed-line{stroke-dasharray:3;}#mermaid-svg-n4cz8nR4OqLJK9JC #compositionStart,#mermaid-svg-n4cz8nR4OqLJK9JC .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC #compositionEnd,#mermaid-svg-n4cz8nR4OqLJK9JC .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC #dependencyStart,#mermaid-svg-n4cz8nR4OqLJK9JC .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC #dependencyStart,#mermaid-svg-n4cz8nR4OqLJK9JC .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC #extensionStart,#mermaid-svg-n4cz8nR4OqLJK9JC .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC #extensionEnd,#mermaid-svg-n4cz8nR4OqLJK9JC .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC #aggregationStart,#mermaid-svg-n4cz8nR4OqLJK9JC .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC #aggregationEnd,#mermaid-svg-n4cz8nR4OqLJK9JC .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-n4cz8nR4OqLJK9JC .edgeTerminals{font-size:11px;}#mermaid-svg-n4cz8nR4OqLJK9JC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ISubject void RegisterObserver(IObserver observer) void RemoveObserver(IObserver observer) void NotifyObservers() IObserver void Update(string weatherInfo) WeatherStation -List observers -string weatherInfo void SetWeatherInfo(string info) void RegisterObserver(IObserver observer) void RemoveObserver(IObserver observer) void NotifyObservers() MobileApp void Update(string weatherInfo) Website void Update(string weatherInfo) Program static void Main(string[] args) 解释
被观察者接口 (ISubject)定义了注册、移除和通知观察者的方法。观察者接口 (IObserver)定义了更新方法当被观察者状态改变时观察者会收到通知。具体被观察者 (WeatherStation)实现了 ISubject 接口管理观察者的注册、移除和通知。具体观察者 (MobileApp 和 Website)实现了 IObserver 接口接收被观察者的通知并进行相应的处理。客户端代码 (Program)创建了 WeatherStation 实例并注册了 MobileApp 和 Website 作为观察者。通过调用 SetWeatherInfo 方法改变天气信息触发观察者的更新方法。之后移除 MobileApp 观察者并再次改变天气信息验证观察者机制。
用途
解耦主题和观察者观察者模式使得主题和观察者之间的依赖关系变得松散主题不需要知道观察者的具体实现。动态注册和注销观察者可以动态地注册和注销使得系统更加灵活。事件驱动适用于事件驱动的系统当某个事件发生时可以通知多个观察者进行相应的处理。
优点
解耦主题和观察者之间的依赖关系被解耦使得代码更加灵活和可维护。扩展性增加新的观察者时不需要修改主题的代码符合开闭原则。动态性观察者可以动态地注册和注销使得系统更加灵活。
缺点
性能问题如果观察者数量较多通知所有观察者可能会导致性能问题。内存泄漏如果观察者没有正确注销可能会导致内存泄漏。调试困难由于观察者模式涉及多个对象之间的交互调试时可能会比较困难。
适用场景
事件驱动系统当需要在某个事件发生时通知多个对象时。解耦对象当需要解耦主题和观察者之间的依赖关系时。动态注册和注销当观察者需要动态地注册和注销时。 实际开发中的应用
1. 消息通知系统
假设我们正在开发一个消息通知系统当用户发布新消息时需要通知多个订阅者如邮件、短信、推送通知等。
using System;
using System.Collections.Generic;// 被观察者接口
public interface IMessagePublisher
{void RegisterSubscriber(IMessageSubscriber subscriber);void UnregisterSubscriber(IMessageSubscriber subscriber);void NotifySubscribers(string message);
}// 观察者接口
public interface IMessageSubscriber
{void OnMessageReceived(string message);
}// 具体被观察者
public class MessagePublisher : IMessagePublisher
{private ListIMessageSubscriber subscribers new ListIMessageSubscriber();public void PublishMessage(string message){NotifySubscribers(message);}public void RegisterSubscriber(IMessageSubscriber subscriber){subscribers.Add(subscriber);}public void UnregisterSubscriber(IMessageSubscriber subscriber){subscribers.Remove(subscriber);}public void NotifySubscribers(string message){foreach (var subscriber in subscribers){subscriber.OnMessageReceived(message);}}
}// 具体观察者
public class EmailSubscriber : IMessageSubscriber
{public void OnMessageReceived(string message){Console.WriteLine($Email received: {message});}
}public class SMS Subscriber : IMessageSubscriber
{public void OnMessageReceived(string message){Console.WriteLine($SMS received: {message});}
}public class PushNotificationSubscriber : IMessageSubscriber
{public void OnMessageReceived(string message){Console.WriteLine($Push notification received: {message});}
}// 客户端代码
class Program
{static void Main(string[] args){MessagePublisher publisher new MessagePublisher();IMessageSubscriber emailSubscriber new EmailSubscriber();IMessageSubscriber smsSubscriber new SMS Subscriber();IMessageSubscriber pushNotificationSubscriber new PushNotificationSubscriber();publisher.RegisterSubscriber(emailSubscriber);publisher.RegisterSubscriber(smsSubscriber);publisher.RegisterSubscriber(pushNotificationSubscriber);publisher.PublishMessage(New message: Hello, world!);publisher.UnregisterSubscriber(emailSubscriber);publisher.PublishMessage(Another message: Goodbye, world!);}
}2. 股票市场监控
假设我们正在开发一个股票市场监控系统当股票价格发生变化时需要通知多个订阅者如投资者、分析师等。 csharp
using System;
using System.Collections.Generic;// 被观察者接口
public interface IStockMarket
{void RegisterInvestor(IInvestor investor);void UnregisterInvestor(IInvestor investor);void NotifyInvestors(string stockInfo);
}// 观察者接口
public interface IInvestor
{void OnStockPriceChange(string stockInfo);
}// 具体被观察者
public class StockMarket : IStockMarket
{private ListIInvestor investors new ListIInvestor();public void UpdateStockPrice(string stockInfo){NotifyInvestors(stockInfo);}public void RegisterInvestor(IInvestor investor){investors.Add(investor);}public void UnregisterInvestor(IInvestor investor){investors.Remove(investor);}public void NotifyInvestors(string stockInfo){foreach (var investor in investors){investor.OnStockPriceChange(stockInfo);}}
}// 具体观察者
public class IndividualInvestor : IInvestor
{public void OnStockPriceChange(string stockInfo){Console.WriteLine($Individual Investor received: {stockInfo});}
}public class InstitutionalInvestor : IInvestor
{public void OnStockPriceChange(string stockInfo){Console.WriteLine($Institutional Investor received: {stockInfo});}
}public class Analyst : IInvestor
{public void OnStockPriceChange(string stockInfo){Console.WriteLine($Analyst received: {stockInfo});}
}// 客户端代码
class Program
{static void Main(string[] args){StockMarket market new StockMarket();IInvestor individualInvestor new IndividualInvestor();IInvestor institutionalInvestor new InstitutionalInvestor();IInvestor analyst new Analyst();market.RegisterInvestor(individualInvestor);market.RegisterInvestor(institutionalInvestor);market.RegisterInvestor(analyst);market.UpdateStockPrice(Apple stock price increased by 5%);market.UnregisterInvestor(individualInvestor);market.UpdateStockPrice(Google stock price decreased by 2%);}
}总结
观察者模式通过定义对象之间的一对多依赖关系使得当一个对象的状态发生改变时所有依赖于它的对象都会得到通知并自动更新。虽然它可能会带来一些性能和调试上的问题但在需要解耦主题和观察者、支持动态注册和注销的场景中观察者模式能够显著提高代码的可维护性和扩展性。