设计模式-观察者模式使用教程
观察者���式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象(称为“主题”或“可观察者”)的状态发生变化时,所有依赖于它的对象(称为“观察者”)都会被自动通知并更新。
()观察者模式主要涉及两类对象:
- 可观察者(Observable,也称为主题Subject):它维护一组观察者,提供用于添加、移除以及通知观察者的方法。
- 观察者(Observer):它定义了接收来自可观察者通知的更新方法。
观察者模式允许可观察者在不了解观察者具体实现的情况下,发送通知给一组观察者,从而实现解耦。
()实现观察者模式
下面是如何在Java中实现观察者模式的一个例子:
首先,定义观察者接口:
1public interface Observer { 2 void update(String message); 3}
然后,创建可观察者接口:
1public interface Observable { 2 void addObserver(Observer observer); 3 void removeObserver(Observer observer); 4 void notifyObservers(String message); 5}
实现可观察者类:
1import java.util.ArrayList; 2import java.util.List; 3 4public class NewsAgency implements Observable { 5 private List observers = new ArrayList(); 6 private String news; 7 8 public void setNews(String news) { 9 this.news = news; 10 notifyObservers(news); 11 } 12 13 @Override 14 public void addObserver(Observer observer) { 15 observers.add(observer); 16 } 17 18 @Override 19 public void removeObserver(Observer observer) { 20 observers.remove(observer); 21 } 22 23 @Override 24 public void notifyObservers(String message) { 25 for (Observer observer : observers) { 26 observer.update(message); 27 } 28 } 29}
接着,实现一个具体的观察者类:
1public class NewsReader implements Observer { 2 private String name; 3 4 public NewsReader(String name) { 5 this.name = name; 6 } 7 8 @Override 9 public void update(String message) { 10 System.out.println(name + " received news: " + message); 11 } 12}
最后,展示如何使用这些类:
1public class Main { 2 public static void main(String[] args) { 3 NewsAgency newsAgency = new NewsAgency(); 4 5 NewsReader reader1 = new NewsReader("Reader 1"); 6 NewsReader reader2 = new NewsReader("Reader 2"); 7 8 newsAgency.addObserver(reader1); 9 newsAgency.addObserver(reader2); 10 11 newsAgency.setNews("New article about Design Patterns!"); 12 13 newsAgency.removeObserver(reader1); 14 15 newsAgency.setNews("Another article, only Reader 2 will receive this!"); 16 } 17}
在上面的例子中,NewsAgency 类是可观察者,它保存了一个观察者列表并有方法来添加、移除和通知观察者。NewsReader 类实现了 Observer 接口,定义了如何接收更新的逻辑。当 NewsAgency 有新消息时,它会调用 notifyObservers() 方法,该方法依次调用每个观察者的 update() 方法,传递消息给他们。
The End