设计模式系列 - Observer模式

简介:

GoF阐述:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下: 

1, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操作) 
2, 观察者(具体执行操作的对象,有多个) 

举例说明:在快乐男生比赛过程其实就是观察者的一个体现,可以这样说吉杰是一个被观察者,而杨二,包小柏,还有巫启贤就是3个观察者,被观察者操作(唱歌)时,观察者们就开始操作(评分),被观察者唱歌就是通知观察者们进行评分。 

代码样例:

被观察对象:需要完成三件事情,添加观察者、删除观察者、通知观察者

Observed.java

 
  1. package com.alibaba.designpattern.observer; 
  2.  
  3. public interface Observed { 
  4.     void addObserver(Viewer observer); 
  5.  
  6.     void removeObserver(Viewer observer); 
  7.  
  8.     void notifyObservers(Message message); 

ConcreteObserved.java

 
  1. package com.alibaba.designpattern.observer; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.List; 
  5.  
  6. public class ConcreteObserved implements Observed{ 
  7.     private List<Viewer> viewers = new ArrayList<Viewer>(); //存在问题:无序,应该使用set
  8.     @Override 
  9.     public void addObserver(Viewer observer) { 
  10.         viewers.add(observer); //存在问题:1、未判断observer是否为空,2、该方法未同步,多线程下存在问题
  11.     } 
  12.  
  13.     @Override 
  14.     public void notifyObservers(Message message) { 
  15.         for(Viewer viewer : viewers){ 
  16.             viewer.getMessage(message); 
  17.         } 
  18.     } 
  19.  
  20.     @Override 
  21.     public void removeObserver(Viewer observer) { 
  22.         viewers.remove(observer); //存在问题:1、未判断observer是否为空,2、该方法未同步,多线程下存在问题
  23.     } 
  24.  

 

观察者:取得被观察对象的通知信息

Viewer.java

 
  1. public interface Viewer { 
  2.     void getMessage(Message message); 

ConcreteViewer.java

 
  1. package com.alibaba.designpattern.observer; 
  2.  
  3. public class ConcreteViewer implements Viewer { 
  4.  
  5.     @Override 
  6.     public void getMessage(Message message) { 
  7.         System.out.println(message.getSubject() + "\t" + message.getBody() 
  8.                 + "\t" + message.getVerify()); 
  9.     } 

通知信息:被观察的内容的封装

Message.java

 
  1. package com.alibaba.designpattern.observer; 
  2.  
  3. import java.io.Serializable; 
  4.  
  5. public interface Message extends Serializable { 
  6.     Object getSubject(); 
  7.  
  8.     Object getBody(); 
  9.  
  10.     Object getVerify(); 

TextMessage.java

 
  1. package com.alibaba.designpattern.observer; 
  2.  
  3. public class TextMessage implements Message { 
  4.     private String subject; 
  5.     private String body; 
  6.     private String verify; 
  7.  
  8.     private static final long serialVersionUID = -542794246119749159L; 
  9.  
  10.     public TextMessage(String subject) { 
  11.         super(); 
  12.         this.subject = subject; 
  13.     } 
  14.  
  15.     public TextMessage(String subject, String body, String verify) { 
  16.         super(); 
  17.         this.subject = subject; 
  18.         this.body = body; 
  19.         this.verify = verify; 
  20.     } 
  21.  
  22.     @Override 
  23.     public String getBody() { 
  24.         return this.body; 
  25.     } 
  26.  
  27.     @Override 
  28.     public String getSubject() { 
  29.         return this.subject; 
  30.     } 
  31.  
  32.     @Override 
  33.     public String getVerify() { 
  34.         return this.verify; 
  35.     } 
  36.  

单元测试

 
  1. @Test 
  2.     public void testNotifyObservers() { 
  3.         Observed observed = new ConcreteObserved(); 
  4.         Viewer viewer1 = new ConcreteViewer(); 
  5.         Viewer viewer2 = new ConcreteViewer(); 
  6.         Viewer viewer3 = new ConcreteViewer(); 
  7.          
  8.         observed.addObserver(viewer1); 
  9.         observed.addObserver(viewer2); 
  10.         observed.addObserver(viewer3); 
  11.          
  12.         observed.notifyObservers(new TextMessage("开会","年中技术大会","andy")); 
  13.         observed.removeObserver(viewer1); 
  14.         observed.notifyObservers(new TextMessage("开会","部门大会","keju")); 
  15.     } 

 

  • 运行结果
 
  1. 开会  年中技术大会  andy 
  2. 开会  年中技术大会  andy 
  3. 开会  年中技术大会  andy 
  4. 开会  部门大会    keju 
  5. 开会  部门大会    keju 

 


本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/530451,如需转载请自行联系原作者

相关文章
|
15天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
19 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
11天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
16天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
1天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
6 0
|
11天前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式
|
1月前
|
设计模式 编译器
解析器模式--设计模式
解析器模式--设计模式
17 0
|
1月前
|
设计模式 算法
构建器模式--设计模式
构建器模式--设计模式
17 0
|
1月前
|
设计模式
【设计模式】中介模式
【设计模式】中介模式