观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并自动更新。观察者模式的实现方式有多种,下面分别从代码实现、UML图、示例说明和应用场景等角度进行分析。
代码实现
观察者模式的核心是被观察者(Subject)和观察者(Observer)两个类,它们之间建立一对多的关系。被观察者类中可以添加和删除观察者对象,并定义通知观察者的方法。观察者类需要实现通知方法来接收被观察者的通知。以下是一个简单的Java代码实现:
```java
public interface Observer {
public void update(String message);
}
public interface Subject {
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers(String message);
}
public class ConcreteSubject implements Subject {
private List
private String message;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void setMessage(String message) {
this.message = message;
notifyObservers(message);
}
}
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer1");
Observer observer2 = new ConcreteObserver("Observer2");
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.setMessage("Hello, world!");
}
}
```
UML图
观察者模式的UML(Unified Modeling Language)图如下所示:

被观察者(Subject)包含观察者(Observer)列表和通知方法,观察者类实现观察方法来接收通知。具体的观察者类实现了观察方法,并使用被观察者注册或删除对象。
示例说明
观察者模式可以用来实现类似邮件订阅的功能:用户可以订阅某个论坛的帖子更新,当有新帖子发布时,用户会收到一封通知邮件。以下是示例代码:
```java
public interface Observer {
public void update(String message);
}
public interface Subject {
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers(String message);
}
public class ForumSubject implements Subject {
private List
private String newPost;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void setNewPost(String post) {
this.newPost = post;
notifyObservers(post);
}
}
public class UserObserver implements Observer {
private String email;
public UserObserver(String email) {
this.email = email;
}
public void update(String message) {
System.out.println("Sent email to " + email + ": New post - " + message);
}
}
public class Client {
public static void main(String[] args) {
ForumSubject forum = new ForumSubject();
UserObserver user1 = new UserObserver("user1@example.com");
UserObserver user2 = new UserObserver("user2@example.com");
forum.addObserver(user1);
forum.addObserver(user2);
forum.setNewPost("Hello, world!");
}
}
```
应用场景
观察者模式可以用于多个对象之间的协作,在以下场景中可以使用观察者模式:
1. GUI界面中,观察者维护对被观察成员的状态并更新UI。
2. 在媒体中,可以订阅主题通知新闻以接收邮件。
3. 在“发布-订阅”应用程序中,被观察者作为发布方,每次发布时观察者都会收到通知。
扫码咨询 领取资料