设计模式(四)—观察者模式
2024-10-14 20:26:06
一、概述
观察者模式类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:
二、代码实现
一个Observer接口: Observer.java
public interface Observer{ public void update();
}
两个实现类: Observer1.java、Observer2.java
public class Observer1 implements Observer{ @Override
public void update(){
System.out.println("observer1 has received...");
} }
public class Observer2 implements Observer{ @Override
public void update(){
System.out.println("observer2 has received...");
} }
Subject接口: Subject.java
public interface Subject{ /*增加观察者*/
public void add(Observer observer); /*删除观察者*/
public void del(Observer observer); /*通知所有的观察者*/
public void notifyObservers(); /*自身的操作*/
public void operation();
}
实现类: AbstractSubject.java、MySubject.java
public class AbstractSubject implements Subject{ private List<Observer> list = new ArrayList<Observer>(); @Override
public void add(Observer observer){
list.add(observer);
} @Override
public void del(Observer observer){
list.remove(observer);
} @Override
public void notifyObservers(){
for(Observer observer : list){
observer.update();
}
} @Override
public void operation(){ }
}
public class MySubject extends AbstractSubject{ @Override
public void operation(){
System.out.println("update self......");
notifyObservers();
}
}
测试:
@Test
public void testObserver(){
MySubject mySubject = new MySubject();
mySubject.add(new Observer1());
mySubject.add(new Observer2());
mySubject.operation();
}
结果:
update self......
observer1 has received...
observer2 has received...
最新文章
- leetcode
- 华为5700s配置链路聚合
- Try to write a script to send e-mail but failed
- 删除Json中的不需要的键值
- Javascript事件模型系列(四)我所理解的javascript自定义事件
- Glyphicons字体图标
- Javascript提升阶段学习
- SVO实时全局光照优化(里程碑MK0):Sparse Voxel Octree based Global Illumination (SVO GI)
- Spark核心概念
- Core Animation
- C#—Dev XtraTabControl动态增加Tab和关闭选项卡方法
- linux 解决Ubuntu编译内核uImage出现问题“mkimage” command not found - U-Boot images will not be built问题
- SPSS Modeler数据挖掘项目实战(数据挖掘、建模技术)
- 开源自己写的一个拖拽库,兼容到IE8+
- 【BZOJ2442】修建草坪(动态规划,单调队列)
- Centos 7 卸载自带的openjdk
- phpmock测试
- DAY1 练习
- Privoxy代理的使用
- jsp中的JSTL与EL表达式用法及区别