观察者模式(Java实现)
2024-09-06 15:49:13
import java.util.ArrayList;
import java.util.Iterator; /* 抽象观察者类 */ abstract class Observer { public abstract void update();
} /* 抽象被观察主题类 */ abstract class Subject{ private ArrayList obs_list = new ArrayList(); public void attach(Observer obs) {
obs_list.add(obs);
} public void Detach(Observer obs) {
obs_list.remove(obs);
} public void notifyObs() {
for (Iterator iter = obs_list.iterator(); iter.hasNext();) {
Observer obs = (Observer) iter.next();
obs.update();
}
}
} /* 具体观察者类 */
class ConcreteObserver extends Observer { private String obs_name;
private ConcreteSubject cc_subj; public ConcreteObserver(String obs_name, ConcreteSubject cc_subj) {
this.obs_name = obs_name;
this.cc_subj = cc_subj;
} public void update() {
if (cc_subj.getStatus() == 1) {
System.out.println("Boss come back, " + obs_name + " turn off screen!");
} else {
System.out.println("Boss go out, " + obs_name + " turn on screen!");
}
}
} /* 具体观察主题类 */
class ConcreteSubject extends Subject {
private int status; public ConcreteSubject(int status) {
this.status = status;
} public int getStatus() {
return status;
} public void setStatus(int status) { if (status != this.status) {
this.status = status;
super.notifyObs();
}
} } public class Observer_Test{ public static void main(String[] args) { ConcreteSubject cc_sub = new ConcreteSubject(0); ConcreteObserver cc_obs1 = new ConcreteObserver("E1", cc_sub);
ConcreteObserver cc_obs2 = new ConcreteObserver("E2", cc_sub);
ConcreteObserver cc_obs3 = new ConcreteObserver("E3", cc_sub);
cc_sub.attach(cc_obs1);
cc_sub.attach(cc_obs2);
cc_sub.attach(cc_obs3); cc_sub.setStatus(1); //status changed to 1
System.out.println("---------------------------------------");
cc_sub.setStatus(0); //status changed to 0 } }
result:
Boss come back, E1 turn off screen!
Boss come back, E2 turn off screen!
Boss come back, E3 turn off screen!
---------------------------------------
Boss go out, E1 turn on screen!
Boss go out, E2 turn on screen!
Boss go out, E3 turn on screen!
最新文章
- 脚手架搭建的vue项目里引入jquery和bootstrap
- spring jdbc 查询结果返回对象、对象列表
- 1-Spark高级数据分析-第一章 大数据分析
- android开发------初识Activity
- bootstrap精简教程
- MyBatis的foreach语句详解
- MongoDB查询语法
- ASP.NET 运行机制
- leetcode面试准备: Maximal Rectangle
- java-下载excel
- 《Programming WPF》翻译 第3章 1.什么是控件
- QT国际化
- 解读Java内部类
- C语言函数不定参数实现方式
- js的原型
- cursor的moveToNext()与moveToFirst()
- 小甲鱼Python第十九讲课后习题
- python使用sax实现xml解析
- [20190321]smem的显示缺陷.txt
- 【springBoot】之定制Banner