Java中的观察者设计模式

在本教程中,我们将讨论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.EventListenerjavax.servlet.http.HttpSessionAttributeListener的类都使用此模式。

此外,很高兴知道Java提供了观察者的基本实现以及分别名为java.util.Observerjava.util.Observable的主题类。

翻译自: https://www.javacodegeeks.com/2019/09/observer-design-pattern-in-java-3.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值