在本教程中,我们将讨论Observer设计模式。
观察者模式有两个主要方面- 主题和观察者 。 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,该对象依赖于一个特定对象( 主体)的状态 。 所有观察者都将自己注册为主题。 每当主题状态发生变化时,所有这些观察者都会得到通知。
使用此观察者模式的一个真实示例是博客订阅。 如果您订阅自己喜欢的博客,则它会在有任何更新时收到通知。
这样,让我们深入研究概念。
UML表示形式:
我们可以使用以下UML表示观察者设计模式:
我们在哪里:
- 主题:维护观察者列表,提供注册/注销观察者的方法。 另外,具有notifyAll()方法可将所有状态更改通知所有注册的观察者
- SubjectImpl:扩展Subject类功能的类,它保存一个表示其当前状态的状态对象。 请注意, 最好有一个不可变的状态对象,以防止观察者进行任何无意的更新
- 观察者:这是一个带有update()方法的接口,由Subject调用以通知观察者当前状态的任何变化
- ConcreteObserver:这些是实现Observer接口的类,观察者对象注册自己以侦听Subject
博客订阅示例:
假设我们要在发布新帖子时通知我们的博客订阅者。 让我们使用观察者模式实现它。
为此,我们首先定义Subject类:
public abstract class Subject { private List<Observer> observers = new ArrayList<>(); public void register(Observer observer) { this .observers.add(observer); } public void unregister(Observer observer) { if ( this .observers.contains(observer)) { this .observers.remove(observer); } } public void notifyAll() { for (Observer o : observers) { o.update(); } } }
我们将Subject类标记为抽象的原因是我们希望Subject具有至少某种状态。
现在我们已经实现了Subject超类,让我们编写Blog类:
public class Blog extends Subject { private String title; private String author; public Blog(String title, String author) { this .title = title; this .author = author; } public void publish(Post post) { //code to publish a new post ... notifyAll(); } public Post getRecentPost() { ... } ... }
我们的Blog类从Subject扩展而来,并在post ()方法内调用notifyAll()方法,以在文章发布后立即通知所有订阅者。
实施观察者:
现在让我们定义Observer接口和Subscriber类:
public interface Observer { void update(); } public class Subscriber implements Observer { private String name; private Subject subject; public Subscriber(String name) { this .name = name; } public void subscribeTo(Subject subject) { subject.register( this ); this .subject = subject; } public void unsubscribeFrom(Subject subject) { subject.unregister( this ); this .subject = null ; } @Override public void update() { if ( this .subject == null ) { System.out.println( "Not yet subscribed!" ); return ; } //get the last published post Post recentPost = this .subject.getRecentPost(); System.out.println( this .name + ", a new post got published: " + recentPost); } }
请注意,博客订阅者将使用subscribeTo()方法订阅博客。 用户订阅博客后,他/她将自动收到发布的所有新帖子的更新。
测试我们的实施:
让我们快速测试一下我们的代码:
//in the main method Subject programmerGirlBlog = new Blog( "ProgrammerGirl" , "Shubhra" ); Observer james = new Subscriber( "James" ); Observer selena = new Subscriber( "Selena" ); james.subscribeTo(programmerGirlBlog); selena.subscribeTo(programmerGirlBlog); Post compositeDesignPattern = new Post( "Composite Design Pattern" ); programmerGirlBlog.publish(compositeDesignPattern);
执行上面的代码后,我们将获得类似以下的输出:
James, a post got published: Composite Design Pattern ... new post got published: Composite Design Pattern ... Selena, a post got published: Composite Design Pattern ... new post got published: Composite Design Pattern ...
结论:
在本快速教程中,我们学习了如何实现Observer设计模式。 此设计模式用于实现发布者-订阅者JMS模型。 此外, 类似java.util.EventListener和javax.servlet.http.HttpSessionAttributeListener的类都使用此模式。
此外,很高兴知道Java提供了观察者的基本实现以及分别名为java.util.Observer和java.util.Observable的主题类。
翻译自: https://www.javacodegeeks.com/2019/09/observer-design-pattern-in-java-3.html