观察者模式详解

打印 上一主题 下一主题

主题 1044|帖子 1044|积分 3132

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
观察者模式详解
1. 界说与描述
观察者模式是一种举动型设计模式,它界说了对象之间的一种一对多依赖关系。这种模式中,有一个被观察的对象(称为主题Subject)和多个观察该对象的观察者(Observer)。主题对象负责维护一组观察者对象,并在自身状态发生改变时关照全部观察者。
2. 布局与脚色
观察者模式包含以下几个脚色:
•  主题(Subject):界说了观察者注册、移除和关照的方法。
•  具体主题(ConcreteSubject):实现主题接口,维护一个观察者列表,当状态发生变革时关照全部观察者。
•  观察者(Observer):界说了一个更新接口,当接收到主题的关照时更新本身。
•  具体观察者(ConcreteObserver):实现观察者接口,更新本身的状态以与主题的状态保持一致。
3. 实用场景
观察者模式实用于以下场景:
•  当一个对象的改变需要同时改变其他对象,而不知道具体有多少个对象有待改变时。
•  当一个抽象模子有两个方面,此中一个方面依赖于另一方面,这时可以通过观察者模式将这两者封装在独立的对象中以使它们各自独立地改变和复用。
•  当对一个对象的改变需要广播到其他对象时。
4. 应用实例
观察者模式广泛应用于各种需要关照多个对象举行同步更新的场所,包括但不限于:
•  GUI事件监听机制:在图形用户界面编程中,按钮、文本框等控件的事件处理通常使用观察者模式。
•  数据模子与视图同步:在MVC架构中,观察者模式常用于数据模子和视图之间的更新同步。
•  发布-订阅体系:观察者模式是发布-订阅体系的底子,答应差别的服务订阅某个主题并接收关照。
•  股票价格监控:在金融体系中,观察者模式可以让股票价格的变革主动关照全部依赖该数据的体系。
•  社交媒体的关照机制:当用户发布新动态时,全部关注者都会收到关照。
5. 代码示例
以下是一个简单的观察者模式的代码示例,展示了怎样实现一个股票价格关照体系:
public interface IStock {
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}
public class Stock implements IStock {
    private List<IObserver> _observers = new ArrayList<>();
    private String symbol;
    private double price;
    public Stock(String symbol, double price) {
        this.symbol = symbol;
        this.price = price;
    }
    public String getSymbol() {
        return symbol;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
        NotifyObservers();
    }
    @Override
    public void RegisterObserver(IObserver observer) {
        _observers.add(observer);
    }
    @Override
    public void RemoveObserver(IObserver observer) {
        _observers.remove(observer);
    }
    @Override
    public void NotifyObservers() {
        for (IObserver observer : _observers) {
            observer.Update(this);
        }
    }
}
public interface IObserver {
    void Update(Stock stock);
}
public class StockObserver implements IObserver {
    private String name;
    public StockObserver(String name) {
        this.name = name;
    }
    @Override
    public void Update(Stock stock) {
        System.out.println("Observer " + name + ": Stock " + stock.getSymbol() + " price updated to " + stock.getPrice());
    }
}
// 客户端代码
public class Program {
    public static void main(String[] args) {
        Stock appleStock = new Stock("AAPL", 150.00);
        IObserver observer1 = new StockObserver("Observer1");
        IObserver observer2 = new StockObserver("Observer2");
        appleStock.RegisterObserver(observer1);
        appleStock.RegisterObserver(observer2);
        appleStock.setPrice(155.00);
        appleStock.setPrice(160.00);
        appleStock.RemoveObserver(observer1);
        appleStock.setPrice(165.00);
    }
}
在这个示例中,Stock 类是具体的主题,StockObserver 是具体观察者,它们通过RegisterObserver和RemoveObserver方法注册和注销观察者,并通过NotifyObservers方法在状态变革时关照全部观察者。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表