观察者模式---上课铃代码

ConcreteObserver1和ConcreteObserver2,两个具体观察者也就是老师和学生。共用一个Observer抽象观察者接口,只有一个response()方法。

ConcreteSubject具体目标类继承了Subject抽象目标类有抽象notifyObserve();//通知观察者方法。

重点是抽象目标Subject的代码:import java.util.ArrayList;import java.util.List;

/** * 抽象目标 */abstract class Subject {    //定义一个观察者集合    用于存储     所有观察者对象    protected List<Observer> observers=new ArrayList<Observer>();    //增加观察者方法    public void add(Observer observer){        observers.add(observer);    }    //删除观察者方法    public void remove(Observer observer){        observers.remove(observer);    }    public abstract void notifyObserve();//通知观察者方法

}List指的是集合.<>是泛型,里面指定了这个集合中存放的是什么数据.Observer是接口也是特殊的抽象类,Observer里面包含了观察者的一些信息.这样每一个Observer对象就代表了一个观察者.此时List<Observer>就代表这个集合中存放了很多个观察者对象

完整代码:ConcreteObserver1ConcreteObserver2ObserverSubjectConcreteSubjectObserverPatten------------------------
Concreteobserver1
package com.anhu.caiyu;

public class ConcreteObserver1 extends ConcreteSubject implements Observer  {

    public void response(){
        if(super.i==1)
        System.out.println("老师上课");
        else
        System.out.println("老师下课");
    }
}
Concreteobserver2
package com.anhu.caiyu;

public class ConcreteObserver2 extends ConcreteSubject implements Observer {
    public void response(){

        if(super.i==1)
        System.out.println("学生进入教室");
        else
            System.out.println("学生放学");
    }

}
Observer
package com.anhu.caiyu;
//抽象观察者
public interface Observer {

   void response();//反应

}
ObserverPatten
package com.anhu.caiyu;

public class ObserverPatten {
    public static void main(String[] args){
        Subject subject=new ConcreteSubject();
        Observer observer1=new ConcreteObserver1();
        Observer observer2=new ConcreteObserver2();
        subject.add(observer1);
        subject.add(observer2);
        subject.notifyObserve();

    }
}

Subject

package com.anhu.caiyu;
//抽象目标
import java.util.ArrayList;
import java.util.List;

/**
 * 抽象目标
 */
abstract class Subject {
    //定义一个观察者集合    用于存储     所有观察者对象
    protected List<Observer> observers=new ArrayList<Observer>();
    //增加观察者方法
    public void add(Observer observer){
        observers.add(observer);
    }
    //删除观察者方法
    public void remove(Observer observer){
        observers.remove(observer);
    }
    public abstract void notifyObserve();//通知观察者方法

}

ConcreteSubject

package com.anhu.caiyu;

public class ConcreteSubject extends Subject{
    static int i=(int)(Math.random()*2);

    public void notifyObserve() {

 if (i == 1) {

    System.out.println("///////////////");
    System.out.println("上课铃声响");

    for (Object object : observers) {
        ((Observer) object).response();
        System.out.println("---------------");
    }
} else {

    System.out.println("////////////");
    System.out.println("下课铃声响");

    for (Object object : observers) {
        ((Observer) object).response();
        System.out.println("---------------");
    }

}
 static int i=(int)(Math.random()*2);随机数只有0或者1static静态变量在内存中只有一个副本,如果没有static就会存在多个副本。虽然让学生和老师都继承的具体目标铃声,并且用super去访问父类变量但是,访问一次会实例化一次父类,因为用的随机数所以会导致学生和老师面对铃声做出的举动不一致。总结:必须要加static让对象共享一个副本。
 

原文地址:https://www.cnblogs.com/caiyu5/p/9646209.html

时间: 2024-10-18 10:58:04

观察者模式---上课铃代码的相关文章

[Android&amp;amp;Java]浅谈设计模式-代码篇:观察者模式Observer

观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个Demo来描写叙述一下这种思想,用java内置的Observer来实现这一思想. 好,程序猿是不善言语的,看代码先. 1.demo的结构: 2.先创建我们的主题类Subject,他就是我们本demo的明星类.继承了Observable,顾名思义,就是被观察的类 .其它观察者对他但是虎视眈眈哦(事实上

Java设计模式之观察者模式

综述 观察者模式(Observer Pattern)也叫做发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.这个模式的一个最重要的作用就是解耦.也就是将被观察者和观察者进行解耦,使得他们之间的依赖性更小,甚至做到毫无依赖.在观察者模式中它定义了一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新.下面就来看一下观察者模式的具体实现. 观察者模式实现 在这里我们假定一个场景,在一个图书管理系统中,现在有这么一个需求

托付和观察者模式

托付在.Net中应用的很广泛.它实现了对函数的封装,能够当做给方法的特征指定一个名称,将方法当做还有一个方法的參数进行传递,这样的将方法动态地赋给參数的做法,能够避免在程序中使用过多的推断(条件)语句.如今将从我们生活中常见的事情--水沸腾了进行警报,进行对照实现. 一般写法: <span style="font-family:SimSun;font-size:14px;">//一般的写法() Public class Heater//热水器{ Private int te

设计模式之十:观察者模式(Observer)

观察者模式: 在对象之间定义了一种一对多的依赖关系,当一个对象改变它的状态时,所有依赖它的对象会自动接收通知并更新自己的状态. Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. UML图: 主要包括: Subjcet(Stock):抽象的主题角色,把所有的观

外行观察者模式

一.引子 还记得警匪片上,匪徒们是怎么配合实施犯罪的吗?一个团伙在进行盗窃的时候,总    有一两个人在门口把风——假设有什么风吹草动.则会马上通知里面的同伙紧急撤退. 或许放风的人并不一定认识里面的每个同伙.而在里面或许有新来的小弟不认识这个放风的.可是这没什么,这个影响不了他们之间的通讯.由于他们之间有早已商定好的暗号. 呵呵,上面提到的放风者.偷窃者之间的关系就是观察者模式在现实中的活生生的样例. 二.定义与结构 观察者(Observer)模式又名公布-订阅(Publish/Subscri

观察者模式在android中使用

观察者模式(Observer) 观察者模式是对象的行为模式,又被叫做为模型-视图模式.这种模式定义了一种一对多的依赖关系,使多个观察者对象同时监听某个角色对象.一旦这个角色对象的状态发生了变化,就会通知所有观察者对象,使它们能够自动更新自己本身. 下面来看下观察者模式的结构,具体如下: 从上面图中可以看出,观察者模式涉及了四个角色,具体如下所示: A.抽象实体角色:这个角色为抽象角色,它把所有的对观察者对象的引用都保存在一个聚集中,每个主题对象都可以有若干个观察者对象,主题角色又叫做抽象被观察者

这个时代的梦想与尊严

除了更好的物质生活,促使人奋斗的动机应该还有很多:集体的归属感,事业的荣誉感,自由的选择权.当社会的经历一次次让人失望,后面的备选项变得黯淡无光时,"一心只想着赚钱"成为许多人无奈下的选择. 记得大一听思修课的时候,思修老师讲,你们作为全国前1%的学生,是不是应该关注和考虑下国家和民族的大事?当时我的内心是很激动的,一种"为往圣继绝学,为万世开太平"的磅礴气概油然而生.现在作为一名即将毕业的学生,看着意外终止的联合学院保研项目,就像被一盆冷水彻底治好中二病.在心情最

论“继承与多态”的重要性

面向对象语言三大特征:封装.继承.多态. 封装:一个类留给外部接口总是小于内部实现的方法. 继承:自雷可以继承父类的字段.属性.方法. 多态:面对同一消息,不同类的对象做出不同的响应. 一.认识继承 (1)生活角度 父类:动物    英雄        人 子类:狗      抗日英雄    中国人 父类          超类        基类 子类          子类        派生类 [继承]也称派生.继承指的是子类继承父类的字段.属性.方法.派生是指子类在父类基础上可以添加自己

java线程基础梳理

java线程 概述 进程:运行时概念,运行的应用程序,进程间不能共享内存 线程:应用程序内并发执行的代码段,可以共享堆内存和方法区内存,而栈内存是独立的. 并发理解:在单核机器上,从微观角度来看,一段时间内cup只能执行一个任务,但是因为cup在只执行一段代码段的时候大部分的时间是处于等待程序的,所以可以再开几条程序,然后通过轮询机制,让cpu执行多个进程,从宏观角度来看就是所谓的并发.如果机器是多核,那么就是真正的并发. 线程调度模型 线程的调度模型分为: 分时调度模型和抢占式调度模型,Jav