观察者模式(Observer)解析例子

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:
摘要:本文深入浅出的讲述了设计模式中的 观察者 模式 , 并给出了简单的示例 , 例子浅显易懂 , 并附带源代码。
       观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在制作系统的过程中,将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了他们的可充用性。这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。这种交互也称为发布-订阅模式,目标是通知的发布者。他发出通知时并不需要知道谁是他的观察者,可以有任意数据的观察者订阅并接收通知。
 
       适用性:在以下的任一情况下可以使用观察者模式:
l          当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中可以使他们各自独立地改变和复用。
l          当对一个对象的改变需要同时改变其它对象,而不知道具体由多少对象有待改变。
l          当一个对象必须通知其他对象,而它又不能假定其他对象是谁,换言之,你不希望这些对象是紧密耦合的。
     例如:老师又电话号码,学生需要知道老师的电话号码以便于在合时的时候拨打,在这样的组合中,老师就是一个被观察者(Subject),学生就是需要知道信息的观察者,当老师的电话号码发生改变时,学生得到通知,并更新相应的电话记录。整体的结构如图1 所示
1 学生观察老师的模型
参与者:
    Subject( 目标, Subject)  
        目标知道它的观察者。可以有任意多个观察者观察同一个目标。
        提供注册和删除观察者对象的接口。
    Observer( 观察者, Observer) :为那些在目标发生改变时需要获得通知的对象定义一个更新接口。
    ConcreteSubject( 具体目标, Teacher)
        将有关状态存入各 ConcreteObserve 对象。
        当他的状态发生改变时,向他的各个观察者发出通知。
    ConcreteObserver( 具体观察者 , Student)
        维护一个指向 ConcreteSubject 对象的引用。
        存储有关状态,这些状态应与目标的状态保持一致。
        实现 Observer 的更新接口以使自身状态与目标的状态保持一致。
 
协作关系:
     ConcreteSubject 发生任何可能导致其观察者与其本身状态不一致的改变时,他将通知他的各个观察者。
     在得到一个具体目标的改变通知后, ConcreteObserver 对象可向目标对象查询信息。 ConcreteObserver 使用这些信息以使他的状态与目标对象的状态一致。
 
相关代码:
    Subject 代码:
    package observer;
public   interface  Subject{
     public   void  attach(Observer o);
     public   void  detach(Observer o);
     public   void  notice();
}
Observer 代码:
package  observer;
public   interface  Observer{
     public   void  update();
}
Teacher 代码;
package  observer;
import  java.util.Vector;
public   class  Teacher  implements  Subject{
     private  String  phone ;
     private  Vector  students ;
     public  Teacher(){
        phone  =  "" ;
        students  =  new  Vector();
    }
     public    void  attach(Observer o){
        students .add(o);
    }
     public   void  detach(Observer o){
        students .remove(o);
    }
     public   void  notice(){
        for ( int  i=0;i< students .size();i++)
           ((Observer) students .get(i)).update();
    }
     public   void  setPhone(String phone){
        this . phone  = phone;
       notice();
    }
     public  String getPhone(){
        return   phone ;
    }
}
Student 代码:
package  observer;
public   class  Student  implements  Observer{
     private  String  name ;
     private  String  phone ;
     private  Teacher  teacher ;
     public  Student(String name,Teacher t){
        this . name  = name;
        teacher  = t;
    }
     public   void  show(){
       System. out .println( "Name:" + name + "\nTeacher'sphone:" + phone );
    }
     public   void  update(){
        phone  =  teacher .getPhone();
    }
}
Client 代码:
package  observer;
import  java.util.Vector;
public   class  Client{
     public   static   void  main(String[] args){
       Vector students =  new  Vector();
       Teacher t =  new  Teacher();
        for ( int  i= 0 ;i<10;i++){
           Student st =  new  Student( "lili" +i,t);
           students.add(st);
           t.attach(st);
       }
       t.setPhone( "88803807" );
        for ( int  i=0;i<10;i++)
              ((Student)students.get(i)).show();
       t.setPhone( "88808880" );
        for ( int  i=0;i<10;i++)
              ((Student)students.get(i)).show();
    }
}
           
 
总结:Observer模式的最知名的应用是在MVC结构,Observer模式可以很好的应用在文档和图表程序的制作中。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/40455如需转载请自行联系原作者

lili00okok
相关文章
|
8月前
|
消息中间件 设计模式 存储
C++观察者模式探索:从设计到应用,一站式全面解析
C++观察者模式探索:从设计到应用,一站式全面解析
340 1
|
8月前
|
设计模式
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
|
设计模式 Java
实时更新:解析Java设计模式中的观察者模式
在软件开发领域,设计模式是一组经过验证的最佳实践方法,用于解决各种常见问题。观察者模式是一种行为型设计模式,其目标是在对象之间建立一种依赖关系,使得一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在本文中,我们将深入了解观察者模式的核心思想、应用场景以及它在Java中的实际运用。
120 0
|
设计模式 Java
Java设计模式解析:观察者模式的应用和实例
Java设计模式解析:观察者模式的应用和实例
|
消息中间件 设计模式 网络协议
Java设计模式 | 观察者模式解析与实战
Java设计模式 | 观察者模式解析与实战
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
93 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
89 0
|
3月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
69 0
|
15天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
15天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多
下一篇
开通oss服务