设计模式01观察者模式(java)
先发代码,有空来写内容。
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)的更多相关文章
- 折腾Java设计模式之观察者模式
观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...
- 设计模式之第18章-观察者模式(Java实现)
设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...
- 23种设计模式全解析 (java版本)
转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...
- java_设计模式_观察者模式_Observer Pattern(2016-07-27)
看了好几篇文章,最终还是觉得<Head First 设计模式>举得例子比较符合观察者模式. 观察者模式概述: 观察者模式有时被称作发布/订阅模式,它定义了一种一对多的依赖关系,让多个观察者 ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- iOS设计模式(01):观察者
iOS设计模式(01):观察者 iOS-Observer-Pattern 什么是观察者模式 什么是观察者模式?你曾经订阅过报纸吗?在订阅报纸的时候,你不用去任何地方,只需要将你的个人地址信息以及订阅信 ...
- Head First 设计模式之观察者模式(Observer Pattern)
前言: 这一节开始学习观察者模式,开始讲之前会先像第一节那样通过一个应用场景来引入该模式.具体场景为:气象站提供了一个WeatherData对象,该对象可以追踪获取天气的温度.气压.湿度信息,Weat ...
- 从设计模式说起JAVA I/O流
从设计模式说起JAVA I/O流 之前写过一篇I/O流的入门介绍,直到最近看了设计模式,顺带理下I/O流的设计思路. JAVA类库中的I/O类分成输入和输出两部分,通过继承,任何自InputStrea ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
随机推荐
- 编译器开发系列--Ocelot语言1.抽象语法树
从今天开始研究开发自己的编程语言Ocelot,从<自制编译器>出发,然后再自己不断完善功能并优化. 编译器前端简单,就不深入研究了,直接用现成的一款工具叫JavaCC,它可以生成抽象语法树 ...
- Kafka:主要参数详解(转)
原文地址:http://kafka.apache.org/documentation.html ############################# System ############### ...
- SpringMVC_简单小结
SpringMVC是一个简单的.优秀的框架.应了那句话简单就是美,而且他强大不失灵活,性能也很优秀. 机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,fi ...
- 从零开始,DIY一个jQuery(2)
在上篇文章我们简单实现了一个 jQuery 的基础结构,不过为了顺应潮流,这次咱把它改为模块化的写法,此举得以有效提升项目的可维护性,因此在后续也将以模块化形式进行持续开发. 模块化开发和编译需要用上 ...
- Jquery双向select控件Bootstrap Dual Listbox
效果预览: 一. 下载插件 github地址:https://github.com/istvan-ujjmeszaros/bootstrap-duallistbox 也可以在这个网站中下载:http: ...
- ABP源码分析十一:Timing
Timing这个简单实用的功能主要用于以统一的方式表示时间.因为ABP中有大量的module,还支持自定义module,所以将时间统一表示为local时间(默认)或utc时间是必要的. IClockP ...
- static,你还敢用吗?
我用火狐的HttpRequester测试开发组里一个同学发布的Web API接口,遇到了一个奇怪的问题. 我测试边界情况时,第一次调用响应的结果是正常的,但当再次及以后的请求时,却返回了异常“Syst ...
- iOS--NSDate的基本操作和常用核心功能
不在赘述理论,直接贴代码 typedef enum : NSUInteger { Date1BelongToPast = -1, Date1BelongToToday = 0, Date1Belong ...
- GitHub实战系列~3.提交github的时候过滤某些文件 2015-12-10
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
- Git异常:fatal: V1.0 cannot be resolved to branch.
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...