先发代码,有空来写内容。

observer1

 import java.util.Observer;
import java.util.Observable; //学生类(Student)继承Observable后变得可以被观察
class Student extends Observable{
//属性
private String name;
private boolean isSleep = false;
private boolean isLate = false;
//构造函数
public Student(){}
public Student(String name){
this.name = name;
}
//睡觉行为
public void sleep(){
System.out.println(name + " is sleeping");
isSleep = true;
setChanged();
notifyObservers(); }
public String toString(){
return name;
}
}
//教师类(Teacher)实现Observer接口成为观察者
class Teacher implements Observer{
@Override
public void update(Observable o,Object arg){
System.out.println("teacher: "+o+",wakeup!wakeup!");
}
}
//班主任类(ClassHead)实现Observer接口成为观察者
class ClassHead implements Observer{
@Override
public void update(Observable o,Object arg){
System.out.println("classHead: "+o+",cleanTheRoomAfterSchool");
}
}
public class ObserverDemo{
public static void main(String[] arguments){
Student tom = new Student("Tom");
tom.addObserver(new ClassHead());
tom.addObserver(new Teacher()); System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
tom.sleep(); }
}

observer2

import java.util.Map;
import java.util.HashMap;
import java.util.Observer;
import java.util.Observable; //学生类(Student)继承Observable后变得可以被观察
class Student extends Observable{
//属性
private String name;
private boolean isSleep = false;
private boolean isLate = false;
//构造函数
public Student(){}
public Student(String name){
this.name = name;
}
//睡觉行为
public void sleep(){
System.out.println(name + " is sleeping");
isSleep = true;
setChanged();
notifyObservers("sleep"); }
//迟到行为
public void late(){
System.out.println(name + " was lated");
isLate = true;
setChanged();
notifyObservers("late");
}
public String toString(){
return name;
}
}
//教师类(Teacher)实现Observer接口成为观察者
class Teacher implements Observer{
//参数arg作为key,该参数触发的回应作为value存储在Map中
private Map<String,String> info = new HashMap<String,String>();
public Teacher(){
info.put("sleep",",wakeup!wakeup!");
info.put("late",",come in.");
}
//添加键值对
public boolean addSay(String k,String v){
return info.put(k,v)==null?false:true;
}
@Override
public void update(Observable o,Object arg){
String say = info.get(arg);
if(say == null){
return;
}
System.out.println("teacher: "+o+say);
}
}
//班主任类(ClassHead)实现Observer接口成为观察者
class ClassHead implements Observer{
private Map<String,String> info = new HashMap<String,String>();
public ClassHead(){
info.put("sleep",",goOutWashBaFace");
info.put("late",",cleanTheRoom!");
}
public boolean addSay(String k,String v){
return info.put(k,v)==null?false:true;
}
@Override
public void update(Observable o,Object arg){
String say = info.get(arg);
if(say == null){
return;
}
System.out.println("classHead: "+o+say);
}
}
public class ObserverDemo{
public static void main(String[] arguments){
Student tom = new Student("Tom");
tom.addObserver(new ClassHead());
tom.addObserver(new Teacher()); System.out.println("有 "+tom.countObservers()+" 个观察者在观察Tom");
tom.sleep();
tom.late();
}
}

Observer与Obvsevable实现

 import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
//定义observer接口
interface observer{
public void update(observable o,Object arg);
}
//定义observable类
class observable{
//isChanged记录实例是否改变
private boolean isChanged;
//obsers存储观察者集合
private List<observer> obsers;
//构造函数初始化实例
public observable(){
isChanged = false;
obsers = new ArrayList<observer>();
}
//设置是否发生变化为false
protected void clearChanged(){
isChanged = false;
}
//设置是否发生变化为true
public void setChanged(){
isChanged = true;
}
//返回对象是否发生改变
public boolean hasChanged(){
return isChanged;
}
//添加观察者
public void addObserver(observer o){
obsers.add(o);
}
//删除指定观察者
public void deleteObserver(observer o){
obsers.remove(o);
}
//清空所有观察者
public void deleteObservers(){
obsers.clear();
}
//返回观察者数量
public int countObservers(){
return obsers.size();
} //如果对象发生改变就通知所有观察者,然后将变化状态设置为false
public void notifyObservers(){
notifyObservers(new Object());
}
public void notifyObservers(Object arg){
if(!hasChanged())
return;
Iterator it = obsers.iterator();
while(it.hasNext()){
((observer)(it.next())).update(this,arg);
}
clearChanged();
}
}

设计模式01观察者模式(java)的更多相关文章

  1. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

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

    设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...

  3. 23种设计模式全解析 (java版本)

    转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...

  4. java_设计模式_观察者模式_Observer Pattern(2016-07-27)

    看了好几篇文章,最终还是觉得<Head First 设计模式>举得例子比较符合观察者模式. 观察者模式概述: 观察者模式有时被称作发布/订阅模式,它定义了一种一对多的依赖关系,让多个观察者 ...

  5. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  6. iOS设计模式(01):观察者

    iOS设计模式(01):观察者 iOS-Observer-Pattern 什么是观察者模式 什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的时候,你不用去任何地方,只需要将你的个人地址信息以及订阅信 ...

  7. Head First 设计模式之观察者模式(Observer Pattern)

    前言: 这一节开始学习观察者模式,开始讲之前会先像第一节那样通过一个应用场景来引入该模式.具体场景为:气象站提供了一个WeatherData对象,该对象可以追踪获取天气的温度.气压.湿度信息,Weat ...

  8. 从设计模式说起JAVA I/O流

    从设计模式说起JAVA I/O流 之前写过一篇I/O流的入门介绍,直到最近看了设计模式,顺带理下I/O流的设计思路. JAVA类库中的I/O类分成输入和输出两部分,通过继承,任何自InputStrea ...

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

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

随机推荐

  1. 微信小程序二维码推广统计

    微信小程序可以通过生成带参数的二维码,那么这个参数是可以通过APP的页面进行监控的 这样就可以统计每个二维码的推广效果. 今天由好推二维码推出的小程序统计工具HotApp小程序统计也推出了带参数二维码 ...

  2. windows 7(32/64位)GHO安装指南(序篇)~

    大家好,本人是高三刚毕业,即将踏入校园的程序猿~我写这篇文章呢,主要是想巩固一下之前对于电脑的基础知识理论,也希望能帮助没有电脑基础的同学能维护一下自己的电脑,要是能帮助女生修电脑那就是更好啦~~哈哈 ...

  3. Create a bridge using a tagged vlan (8021.q) interface

    SOLUTION VERIFIED April 27 2013 KB26727 Environment Red Hat Enterprise Linux 5 Red Hat Enterprise Li ...

  4. SpringMVC 数据校验

    1.引入jar包 2.配置验证器 <!-- 配置验证器 --> <bean id="myvalidator" class="org.springfram ...

  5. .Net中的AOP系列之《拦截位置》

    返回<.Net中的AOP>系列学习总目录 本篇目录 位置拦截 .Net中的字段和属性 PostSharp位置拦截 真实案例--懒加载 .Net中的懒加载 使用AOP实现懒加载 如何懒加载字 ...

  6. Entity Framework 6 Recipes 2nd Edition(12-1)译 -> 当SaveChanges( ) 被调用时执行你的代码

    第12章定制EF 在本章的小节里,定制实体对象和EF处理的一些功能.这些小节将涵盖很多”幕后”的事情,能让你的代码更加统一解决一些事情,比如用一个业务规则中心统一地为实体执行验证. 本章开始的小节,将 ...

  7. STM32的入侵检测是干什么用的

    [引]:侵入检测的作用就是监测侵入事件,保护重要的数据不被非法窃取. 你的数据是保存在RAM里的;但是一掉电RAM里的数据就没了;有一块地方,后备电池相关的一块RAM的数据却放不掉(除非电池没电了); ...

  8. tomcat RMI 停不掉

    项目采用jfinal框架,做了一个RMI的服务,对其它程序提供服务.实现上,写了一个RmiPlugin package com.wisdombud.cloudtalk.plugin; import j ...

  9. Android开发之Android Material Design Toolbar自定义随笔

    一.自定义Toolbar的menu: 在menu下新建menu.xml文件,自定义menu的样式: <menu xmlns:android="http://schemas.androi ...

  10. 如何下载Github单个文件(Windows平台)

    如何下载Github单个文件(Windows平台) 前提 安装Chrome 浏览器 Chrome浏览器 安装迅雷软件 安装Chrome 迅雷插件 可能商店里迅雷插件有好几种,这里使用这一种 一般使用者 ...