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

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. VC中的MFC到底是什么?

    1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ...

  2. BPM流程中心解决方案分享

    一.需求分析 在过去办公自动化的浪潮中,很多企业已经实施了OA流程,但随着客户的发展和对流程管理的越来越重视, 客户对流程应用需求越来越深 入,您可能面临以下需求: 1.流程功能不能满足需求,包括流程 ...

  3. 听H3絮叨:何以让天下没有难用的流程

    最近朋友圈.网站新闻铺天盖地是"让天下没有难用的流程",有人就要问了,H3 BPM何德何能,为BPM站台,让天下没有难用的流程? 这是一个关于"办公室空想"的故 ...

  4. Atitit.研发管理软件公司的软资产列表指南

    Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...

  5. oracle常用函数及示例

    学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...

  6. Win10命令提示符(cmd)怎么复制粘贴

    在Win10系统里右键开始菜单,选择弹出菜单里的命令提示符,如下图所示: 然后复制要粘贴的文字,例如: echo hovertree.com 把上面的文字复制后,点击命令提示符窗口,然后在命令提示符窗 ...

  7. 创建maven项目(cmd 命令)

    2016五月 22 原 创建maven项目(cmd 命令) 分类:maven (994) (0) 1.普通方式创建 1)进入cmd窗口执行 mvn archetype:generate 2) 光标停止 ...

  8. git 行动指南

    Git是一个分布式的版本管理工具. 在本地项目和服务器都会拥有版本库,本地版本库由自己控制,自由选择提交代码到服务器端 windows上也建议使用命令的方式来使用git,推荐使用客户端 :http:/ ...

  9. 构建Web API服务

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 构建动态Web API控制器 ABP可以自动地为应用层生成Web API 层.比如说我们之前创建的应用层: namespace N ...

  10. [Java Collection]List分组之简单应用.

    前言 今天有一个新需求, 是对一个List进行分组, 于是便百度到一些可用的代码以及我们项目使用的一些tools, 在这里总结下方便以后查阅. 一: 需求 现在我们一个数据库表t_series_val ...