设计模式之观察者模式
来源:互联网 发布:linux oracle 查看sid 编辑:程序博客网 时间:2024/05/09 04:35
设计模式之观察者模式
观察者模式就是多个观察者对象监视一个主题的对象,当主题对象的内部的状态发生改变时,就通知监视该主题对象的诸多的观察对象,是观察对象的状态也发生相应的改变。
观察者模式的组成:
抽象的观察角色:一般用一个接口或者抽象的类来实现,其中定义了观察者必须实现的方法。
主题角色:维护一个集合,存放所有的观察者对象的引用,可以删除观察者,可以添加观察者,如果一个对象想要成为被观察的对象,只要继承主题角色就可以了。
具体的观察角色:具体的观察角色要实现抽象的观察角色方法,以便当主题对象的内部的状态发生改变的时候,该方法被调用。
观察者模式简单地实现:(java实现):
Watched类:
import
java.util.Iterator;
import
java.util.LinkedList;
import
java.util.List;
/**被观察角色即主题角色*/
public
class
Watched {
private
List<Watcher> watchers =
new
LinkedList<Watcher> ();
private
boolean
changed =
false
;
public
Watched () {}
//增加观察者
public
Watched addWatcher (Watcher watcher) {
this
.watchers.add(watcher);
return
this
;
}
//删除观察者
public
Watched removeWatcher (Watcher watcher) {
this
.watchers.remove(watcher);
return
this
;
}
//删除所有
public
void
removeAllWatchers () {
this
.watchers.clear();
}
protected
void
setChanged () {
this
.changed =
true
;
}
public
boolean
hasChanged () {
return
this
.changed;
}
protected
void
clearChanged () {
this
.changed =
false
;
}
public
int
countOfWatchers () {
return
this
.watchers.size();
}
//通知观察者
public
void
notifyAllWatchers (Object ob) {
if
(
this
.changed) {
Iterator<Watcher> it =
this
.watchers.iterator();
while
(it.hasNext()) {
it.next().update(
this
, ob);
}
this
.clearChanged();
}
}
}
Watcher接口:
/**抽象的观察角色*/
public
interface
Watcher {
public
void
update (Watched watched,Object ob);
}
Test:测试类:
public
class
Test {
public
static
void
main(String[] args) {
//观察者对象
Watcher student_1 =
new
Student ();
Watcher student_2 =
new
Student ();
Watcher student_3 =
new
Student ();
//被观察的对象
Teacher teacher =
new
Teacher ();
//添加观察者
teacher.addWatcher(student_1)
.addWatcher(student_2)
.addWatcher(student_3);
//主题对象内部状态改变
teacher.setChanged();
//通知观察者对象
teacher.notifyAllWatchers(
"老师来了"
);
}
}
/**Teacher类继承了Watched,Teacher类的对象就成为一个被观察的对象*/
class
Teacher
extends
Watched {
public
void
setChanged () {
super
.setChanged();
}
}
/**Student是观察者*/
class
Student
implements
Watcher {
@Override
public
void
update(Watched arg0, Object message) {
if
(
null
!= message) {
System.out.println(message);
}
}
}
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- hdu Cat vs. Dog (二分匹配)
- 微信开放平台- 使用 入门篇
- Linux菜鸟---安装VMware Tools
- 印度大停电对全球的警示
- 基于PHP的cURL快速入门
- 设计模式之观察者模式
- C# 二进制,十进制,十六进制 互转
- C++11 thread
- 设计模式之单例模式
- C#索引器
- WINDOWS批处理
- 小数为什么有误差?
- ie6 解决a标签奇数中文传参乱码问题
- 暂无