设计模式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 ...
随机推荐
- Javascript高性能编程-提高Dom访问速度
在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度.下面是对如何优化的一些总结: 将需要多次操作的节点存储在一个 ...
- Android Studio 编译单个module
前期自己要把gradle环境变量配置好 在Terminal中gradle命令行编译apk 输入gradle assembleRelease 会编译全部module编译单个modulecd ./xiru ...
- No plugin found for prefix ‘jetty’ in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories
maven配置文件(最大的那个)的<pluginGroups></pluginGroups>增加一行如下<pluginGroups><pluginGroup& ...
- oracle常用的快捷键
最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他同事使用PLSQL 编程效率明显高于自己,观察了好久,才发现他使用PLSQL 已经很长时间了而且,他自己也在其中添加了好多快捷方式, 1.登 ...
- 使用Hystrix提高系统可用性
今天稍微复杂点的互联网应用,服务端基本都是分布式的,大量的服务支撑起整个系统,服务之间也难免有大量的依赖关系,依赖都是通过网络连接起来. (图片来源:https://github.com/Netfli ...
- 【Knockout.js 学习体验之旅】(3)模板绑定
本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 谈谈 Lock
上来先看MSDN关于lock的叙述: lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. 下面的示例包含一个 lock 语句. lock 关键字可确保当一 ...
- Intellij IDEA 13.1.3 使用Junit4
作者QQ:1095737364 一.环境配置 安装JUnit插件步骤: File-->settings-->Plguins-->Browse repositories--> ...
- WCF学习之旅—实现支持REST服务端应用(二十三)
在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...
- 后HTML5时代
十二年前,无论多么复杂的布局,在我们神奇的table面前,都不是问题:十年前,阿捷的一本<网站重构>,为我们开启了新的篇章:八年前,我们研究yahoo.com,惊叹它在IE5下都表现得如此 ...