软考
APP下载

观察者模式实现方式

观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并自动更新。观察者模式的实现方式有多种,下面分别从代码实现、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 observers = new ArrayList<>();

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)图如下所示:

![观察者模式UML图](https://i.imgur.com/VxBcLjj.png)

被观察者(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 observers = new ArrayList<>();

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. 在“发布-订阅”应用程序中,被观察者作为发布方,每次发布时观察者都会收到通知。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库