观察者模式(Java实现)

import java.util.ArrayList;
import java.util.Iterator;

/* 抽象观察者类 */

abstract class Observer {

    public abstract void update();
}

/* 抽象被观察主题类 */

abstract class Subject{

    private ArrayList obs_list = new ArrayList();

    public void attach(Observer obs) {
        obs_list.add(obs);
    }

    public void Detach(Observer obs) {
        obs_list.remove(obs);
    }

    public void notifyObs() {
        for (Iterator iter = obs_list.iterator(); iter.hasNext();) {
            Observer obs = (Observer) iter.next();
            obs.update();
        }
    }
}

/* 具体观察者类 */
class ConcreteObserver extends Observer {

    private String obs_name;
    private ConcreteSubject cc_subj;

    public ConcreteObserver(String obs_name, ConcreteSubject cc_subj) {
        this.obs_name = obs_name;
        this.cc_subj = cc_subj;
    }

    public void update() {
        if (cc_subj.getStatus() == 1) {
            System.out.println("Boss come back, " + obs_name + " turn off screen!");
        } else {
            System.out.println("Boss go out, " + obs_name + " turn on screen!");
        }
    }
}

/* 具体观察主题类 */
class ConcreteSubject extends Subject {
    private int status;

    public ConcreteSubject(int status) {
        this.status = status;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {

        if (status != this.status) {
            this.status = status;
            super.notifyObs();
        }
    }

}

public class Observer_Test{

    public static void main(String[] args) {

        ConcreteSubject cc_sub = new ConcreteSubject(0);

        ConcreteObserver cc_obs1 = new ConcreteObserver("E1", cc_sub);
        ConcreteObserver cc_obs2 = new ConcreteObserver("E2", cc_sub);
        ConcreteObserver cc_obs3 = new ConcreteObserver("E3", cc_sub);
        cc_sub.attach(cc_obs1);
        cc_sub.attach(cc_obs2);
        cc_sub.attach(cc_obs3);

        cc_sub.setStatus(1); //status changed to 1
        System.out.println("---------------------------------------");
        cc_sub.setStatus(0); //status changed to 0

    }

}

result:

Boss come back, E1 turn off screen!
Boss come back, E2 turn off screen!
Boss come back, E3 turn off screen!
---------------------------------------
Boss go out, E1 turn on screen!
Boss go out, E2 turn on screen!
Boss go out, E3 turn on screen!

时间: 2024-10-25 14:10:55

观察者模式(Java实现)的相关文章

设计模式之第18章-观察者模式(Java实现)

设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说来自意大利电影<滴露牡丹开>中一个专门偷拍明星照片的一个摄影师的名字,“Paparazzo”,中文译为帕帕拉齐,俗语就是狗仔队.这些明星因狗仔队而荣,获得曝光率,也因狗仔队而损,被曝光负面新闻,不管怎么说,总之是“火起来了”,让明星们又爱又恨.(众人:鱼哥,你扯远了).咳咳,这个狗仔队其实嘛,也就

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

观察者模式--Java设计模式

观察者模式定义:定义了对象之间的一对多的依赖,这样一来,当一个对象发生改变状态的时候,它的所有依赖者都会收到通知并自动更新.参考如下图: 观察者设计模式也叫发布-订阅模式. 也可以称作:出版者+订阅者 = 观察者模式 在Android中观察者模式的实例有:广播机制,ContentObserver的注册方式,一个是同步的观察者模式,一个是异步的观察者模式. 当两个对象之间松耦合,它们依然可以交互,但是不清楚彼此的细节,观察者提供了一种对象的设计,可以降低之间的耦合,避免对象的双向依赖. 举例:在A

观察者模式/ java实现附代码 /

/注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: 一个天气预报系统,凡是订阅了改天气预报的,当天气发生改变的时候就把通知发送给所有订阅该天气预报的人.如兽人族(Orcs)和霍比特人(Hobitts)订阅了该天气预报系统,当天气从晴变成雨天的时候,兽人族和霍比特人就收到了天气变成雨天的通知. 如果还有其他订阅了该天气预报的如人族(Terran),只

设计模式之观察者模式(java内置)

DisplayElement.java,WeatherStation.java同上 WeatherData.java import java.util.Observable; public class WeatherData extends Observable { private float temperature; private float humidity; private float pressure; public float getTemperature() { return te

朝花夕拾--观察者模式-java笔记

先看一下类图: 具体实现: package obs.self; /**  * 被观察对象  * @author wangfeihu  *  */ public interface Subject {     /**      * 增加一个观察者      * @param observer      */     public void addObserver(Observer observer);          public void removeObserver(Observer obs

设计模式01观察者模式(java)

先发代码,有空来写内容. observer1 1 import java.util.Observer; 2 import java.util.Observable; 3 4 //学生类(Student)继承Observable后变得可以被观察 5 class Student extends Observable{ 6 //属性 7 private String name; 8 private boolean isSleep = false; 9 private boolean isLate =

Java的观察者模式

在慕课网上学习了观察者模式,故做个笔记温习巩固一下http://www.imooc.com/learn/415 自己写一个经典观察者模式 观察者模式定义 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到了通知并自动更新. 好处:统一通知,各自处理. 认识观察者(六大方面): 1.目标与观察者之间的关系(1VS1.1VSn.nVS1) 2.单向依赖(又称为订阅发布模式) 3.命名建议 ?1.目标接口的定义,建议在名称后跟Subject ?2.观察者接口的定

Java中的设计模式(七):观察者模式

介绍 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用.在观察者模式中,监视另一个对象状态的对象称为Observer,正在被监视的对象称为Subject. 根据GoF,观察者设计模式的意图是; 定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项. Subject包含一个观察者列表,用于通知其状态的任何变化,因此它应该提供观察者可以注册和注销自己的方法.Subject还包含一种方法,用于通知所有观察者任何更