希赛考试网
首页 > 软考 > 软件设计师

观察者模式实现方式

希赛网 2024-06-06 18:25:25

观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并自动更新。观察者模式的实现方式有多种,下面分别从代码实现、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. 在“发布-订阅”应用程序中,被观察者作为发布方,每次发布时观察者都会收到通知。

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件