设计模式-观察者模式
2016-05-04 11:11
465 查看
一 、定义
观察者模式让多个观察者对象同时监听一个被观察者,当被观察者对象状态发生改变时,会通知所有观察者,让他们更新自己。
二 、构成
1 抽象观察者:为所有的具体观察者定义一个接口,在得到被观察者的通知时,具体观察者及时更细自己。
2 具体观察者:抽象观察者的实现类,要重写抽象观察者中的方法。
3 抽象被观察者:把所有观察者对象的引用保存在一个集合中,抽象被观察者还提供一个接口,可以增加和删除观察者角色,一般用一个抽象类和接口来实现。
4 具体被观察者:当被观察者状态发生变化时,给集合中的观察者发出通知。
三 、实现
//抽象的观察者
public interface Watcher {
public void update(String str);
}
//具体的观察者
public class ConcreteWatcher implements Watcher {
public void update(String str) {
System.out.println(str);
}
}
//抽象的被观察者
public interface Watched {
public void addWatcher(Watcher watcher);
public void deleteWatcher(Watcher watcher);
public void notifyAllWatchers(String str);
}
//具体的被观察者
public class ConcreteWatched implements Watched {
private ArrayList<Watcher> list = new ArrayList<>();
public void addWatcher(Watcher watcher) {
list.add(watcher);
}
public void deleteWatcher(Watcher watcher) {
list.remove(watcher);
}
public void notifyAllWatchers(String str) {
for (Watcher watcher : list) {
watcher.update(str);
}
}
}
//测试
public class TestObserver {
public static void main(String[] args) {
Watched watched = new ConcreteWatched();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();
Watcher watcher4 = new ConcreteWatcher();
watched.addWatcher(watcher1);
watched.addWatcher(watcher2);
watched.addWatcher(watcher3);
watched.addWatcher(watcher4);
watched.notifyAllWatchers("我的状态改变了");
}
}
输出:
我的状态改变了
我的状态改变了
我的状态改变了
我的状态改变了
观察者模式让多个观察者对象同时监听一个被观察者,当被观察者对象状态发生改变时,会通知所有观察者,让他们更新自己。
二 、构成
1 抽象观察者:为所有的具体观察者定义一个接口,在得到被观察者的通知时,具体观察者及时更细自己。
2 具体观察者:抽象观察者的实现类,要重写抽象观察者中的方法。
3 抽象被观察者:把所有观察者对象的引用保存在一个集合中,抽象被观察者还提供一个接口,可以增加和删除观察者角色,一般用一个抽象类和接口来实现。
4 具体被观察者:当被观察者状态发生变化时,给集合中的观察者发出通知。
三 、实现
//抽象的观察者
public interface Watcher {
public void update(String str);
}
//具体的观察者
public class ConcreteWatcher implements Watcher {
public void update(String str) {
System.out.println(str);
}
}
//抽象的被观察者
public interface Watched {
public void addWatcher(Watcher watcher);
public void deleteWatcher(Watcher watcher);
public void notifyAllWatchers(String str);
}
//具体的被观察者
public class ConcreteWatched implements Watched {
private ArrayList<Watcher> list = new ArrayList<>();
public void addWatcher(Watcher watcher) {
list.add(watcher);
}
public void deleteWatcher(Watcher watcher) {
list.remove(watcher);
}
public void notifyAllWatchers(String str) {
for (Watcher watcher : list) {
watcher.update(str);
}
}
}
//测试
public class TestObserver {
public static void main(String[] args) {
Watched watched = new ConcreteWatched();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();
Watcher watcher4 = new ConcreteWatcher();
watched.addWatcher(watcher1);
watched.addWatcher(watcher2);
watched.addWatcher(watcher3);
watched.addWatcher(watcher4);
watched.notifyAllWatchers("我的状态改变了");
}
}
输出:
我的状态改变了
我的状态改变了
我的状态改变了
我的状态改变了
相关文章推荐
- java线程深度解析(二)——线程互斥技术与线程间通信
- 理解Java中的final和static关键字
- JAVA 中BIO,NIO,AIO的理解
- IDEA 编译错误:java: try-with-resources is not supported in -source 1.6 (use -source 7 or higher to enable try-with-resources)
- 160504、springmvc返回json数据编码格式设定
- JAVA实现二叉树的遍历的非递归算法及递归算法(前序,中序,后序,层次)
- Struts2漏洞修复总结
- Java集合总结系列2:Collection接口
- Spring中配置和读取多个Properties文件
- Spring scope属性详解
- java基础の重载和重写区别和联系
- JAVA中创建ZIP文件,并向ZIP文件中写入并读取条目和数据
- (转载)JavaWeb学习总结(五十)——文件上传和下载
- DWR中各种java方法的调用
- Struts2单个与多个文件上传之一
- java基础のsuper和this区别和联系
- Eclipse WEB项目更改项目名
- 蓝桥杯 六角幻方 2014年JavaB组决赛试题
- java 基础
- Java线程:概念与原理