观察者模式 Observer

观察者模式 Observer

  这是软件设计模式的一种。

  又被称为:

  发布-订阅<Publish/Subscribe>模式、

  模型-视图<Model/View>模式、

  源-收听者<Source/Listener>模式

  或从属者<Dependents>模式)

    观察者模式(Observer)完美的将观察者和被观察的对象分离开。

  此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。

  这通常透过呼叫各观察者所提供的方法来实现。

 

  观察者设计模式:观察者设计模式解决的问题时当一个对象发生指定的动作时,要通过另外一个对象做出相应的处理。

  观察者设计模式的步骤:
      1. 当前目前对象发生指定的动作是,要通知另外一个对象做出相应的处理,这时候应该把对方的相应处理方法定义在接口上。
      2. 在当前对象维护接口的引用,当当前对象发生指定的动作这时候即可调用接口中的方法了。 

 

  此种模式通常被用来实作事件处理系统。   有多个观察者时,不可以依赖特定的通知次序。

  Swing大量使用观察者模式,许多GUI框架也是如此。

 

案例说明:  编写一个气象站 类、一个工人 类  、一个学生类,当气象站更新天气 的时候,要通知 人和学生 做出相应的处理。

public class WeatherStation {
    private String weather;//当前天气
    String[] weathers = {"下雨","下雪","下冰雹","出太阳"};
    private static List<BookWeather> list = new ArrayList<BookWeather>();//该集合中存储的都是需要收听天气预报的人
    Random random = new Random();
    public void addListaner(BookWeather e){
        list.add(e);
    }
    public void startWork(){ //开始工作
        new Thread(){
            @Override
            public void run() {
                while(true){
                    updateWeather();for(BookWeather item : list)
{ item.notifyWeather(weather); //更新天气给收听者 }
                    try {
                        Thread.sleep(random.nextInt(1000)+500);//每0.5-1.5秒更新一次天气
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
    public void updateWeather(){//更新天气
        weather = weathers[random.nextInt(4)];
        System.out.println("天气:"+ weather);
    }        
}

 

public interface BookWeather { //订阅天气预报的接口
    public void notifyWeather(String weather);
}

 

public class Person implements BookWeather {//Person要根据天气做出相应的处理
    String name;
    public  Person(String name){
        this.name = name;
    }
    //下雨","下雪 ","下冰雹","出太阳"
    @Override
    public void notifyWeather(String weather) {
        if("下雨".equals(weather)){
            System.out.println(name+"打着雨伞 上班");
        }else if("下雪".equals(weather)){
            System.out.println(name+"戴着被子 上班");
        }else if("下冰雹".equals(weather)){
            System.out.println(name+"带着头盔 上班");
        }else if("出太阳".equals(weather)){
            System.out.println(name+"嗮着太阳 上班");
        }
    }
}

public class Student implements BookWeather {
    String name;
    public Student(String name) {
        this.name = name;
    }
    @Override
    public void notifyWeather(String weather) {
        if ("下雨".equals(weather)) {
            System.out.println(name + "打着雨伞 上学");
        } else if ("下雪".equals(weather)) {
            System.out.println(name + "戴着被子 上学");
        } else if ("下冰雹".equals(weather)) {
            System.out.println(name + "带着头盔 上学");
        } else if ("出太阳".equals(weather)) {
            System.out.println(name + "嗮着太阳 上学");
        }
    }
}

 

public class test {
    public static void main(String[] args) throws InterruptedException {
        WeatherStation station = new WeatherStation();
        station.startWork();
        Person p1 = new Person("小明");
        Person p2 = new Person("小红");
        Student p3 = new Student("小青 ");
        station.addListaner(p1);
        station.addListaner(p2);
        station.addListaner(p3);
    }
}

 

输出:

 

时间: 2024-08-07 12:58:25

观察者模式 Observer的相关文章

观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove)\通知(notify)观察者; 观察者(observer)接口, 负责更新(update)数据; 主题(subject)接口: 注册观察者(registerObserver), 删除观察者(removeObserver), 通知观察者(

设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

设计模式 ( 十五 ) 观察者模式Observer(对象行为型)    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你

乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:webabcd 介绍 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例 有一个Message实体类,某些对象对它的操作有Insert()方法,当发生某些改变的时候,通知所有这些对象并执行Insert()方法. MessageModel using

设计模式:观察者模式(observer)

设计模式:观察者模式(observer) 这种设计模式大量的使用,简单的说就是观察者通过被观察者来获得外界某种事物的状态 Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步. 如下图: image.png 被观察者(concreteSubject):其中必然包含了一个观察者的列表,用于状态发生变化的时候通过链表进行通知每个观察者做出相应的变化 观察者(ConcreteObserver):其中必然包含各种应对外界状态变化的方法,以供被观察者调用 图中

【设计模式】—— 观察者模式Observer

模式意图 观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布--其他人接受. 这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化. 模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面.只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程. 这个模式代码相对来说比较容易理解,而且应用很广泛. 应用场景 1 当一个模型有几个展现方面,通过修改一个展现,顺便更新其他的.就好比一个网站的有web端,也

观察者模式(Observer Pattern) Java内置使用方法

Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观察的): 是一个父类(class),addObserver(), 添加观察者; deleteObserver(), 删除观察者; notifyObservers(), 通知观察者;setChanged(), 确认更改; Observer(观察者): 是一个接口(interface), update(), 更新观察者数据; setChanged()->notifyObservers(),

设计模式之观察者模式 (Observer Design Pattern)

一.什么是观察者模式 观察者定义了一种一对多的依赖关系,当一个主题(Subject)对象状态发生变化时,所有依赖它的相关对象都会得到通知并且能够自动更新自己的状态,这些依赖的对象称之为观察者(Observer)对象这类似于发布/订阅模式. 观察者模式中的主题对象,会维持着一个依赖它的观察者对象列表,当主题对象状态发生改变时,主题对象便会调用这个列表中所有观察者对象的方法. 观察者模式一般用在分布式时间处理系统,它也是流行的MVC模型的核心设计模式. 二.观察者模式中的角色 观察者模式主要涉及到三

学习php设计模式 php实现观察者模式(Observer)_php技巧

一.意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新[GOF95] 又称为发布-订阅(Publish-Subscribe)模式.模型-视图(Model-View)模式.源-监听(Source-Listener)模式.或从属者(Dependents)模式二.观察者模式结构图   三.观察者模式中主要角色抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者.抽象主题提供了增加和删除观

.NET设计模式:观察者模式(Observer Pattern)

意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式结构图 生活中的例子 观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新.拍卖演示了这种模式.每个投标人都有一个标有数字的牌子用于出价.拍卖师开始拍卖时,他观察是否有牌子举起出价.每次接受一个新的出价都改变了拍卖的当前价格,并且广播给所有的投标人进行新的出价. 图2 使用拍卖例子