zoukankan      html  css  js  c++  java
  • Java二十三设计模式之------观察者模式

    一、观察者模式(Observer)

    观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:

    我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。我们看实现代码:

    一个Observer接口:

     
    1. public interface Observer {  
    2.     public void update();  
    3. }  

    两个实现类:

     
    1. public class Observer1 implements Observer {  
    2.   
    3.     @Override  
    4.     public void update() {  
    5.         System.out.println("observer1 has received!");  
    6.     }  
    7. }  
     
    1. public class Observer2 implements Observer {  
    2.   
    3.     @Override  
    4.     public void update() {  
    5.         System.out.println("observer2 has received!");  
    6.     }  
    7.   
    8. }  

    Subject接口及实现类:

     
    1. public interface Subject {  
    2.       
    3.     /*增加观察者*/  
    4.     public void add(Observer observer);  
    5.       
    6.     /*删除观察者*/  
    7.     public void del(Observer observer);  
    8.       
    9.     /*通知所有的观察者*/  
    10.     public void notifyObservers();  
    11.       
    12.     /*自身的操作*/  
    13.     public void operation();  
    14. }  
     
    1. public abstract class AbstractSubject implements Subject {  
    2.   
    3.     private Vector<Observer> vector = new Vector<Observer>();  
    4.     @Override  
    5.     public void add(Observer observer) {  
    6.         vector.add(observer);  
    7.     }  
    8.   
    9.     @Override  
    10.     public void del(Observer observer) {  
    11.         vector.remove(observer);  
    12.     }  
    13.   
    14.     @Override  
    15.     public void notifyObservers() {  
    16.         Enumeration<Observer> enumo = vector.elements();  
    17.         while(enumo.hasMoreElements()){  
    18.             enumo.nextElement().update();  
    19.         }  
    20.     }  
    21. }  
     
    1. public class MySubject extends AbstractSubject {  
    2.   
    3.     @Override  
    4.     public void operation() {  
    5.         System.out.println("update self!");  
    6.         notifyObservers();  
    7.     }  
    8.   
    9. }  


    测试类:

     
    1. public class ObserverTest {  
    2.   
    3.     public static void main(String[] args) {  
    4.         Subject sub = new MySubject();  
    5.         sub.add(new Observer1());  
    6.         sub.add(new Observer2());  
    7.           
    8.         sub.operation();  
    9.     }  
    10.   
    11. }  

    输出:

    update self!
    observer1 has received!
    observer2 has received!

    转载 https://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

  • 相关阅读:
    参考vue.js实现双向绑定的方法理解双向绑定原理(:Object.defineProperty和发布-订阅模式)
    不错的站点 博文
    使用C#动态生成Word文档/Excel文档的程序测试通过后,部署到IIS服务器上,不能正常使用的问题解决方案
    详解HTML<head> 头标签元素的意义以及使用场景
    css奇特用法之 IMG添加背景图片配合显示--效果惊艳
    .net面试题-15k+左右
    微信小程序IOS真机调试发生了SSL 错误,无法建立与该服务器的安全连接
    微信小程序自定义组件-下拉框
    微信小程序语音(A)发给别人(B),也能播放,是需要先把语音上传到自己的服务器上才可以
    微信小程序循环中点击一个元素,其他的元素不发生变化,类似点击一个循环中的语音,其他的不发生点击事件
  • 原文地址:https://www.cnblogs.com/wuxinyiwu/p/8335629.html
Copyright © 2011-2022 走看看