设计模式之观察者模式
来源:互联网 发布:dnf安图恩数据异常 编辑:程序博客网 时间:2024/06/07 15:42
定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。
场景
水质检测。当水质为清澈时,让检测人员进行记录,当水质为轻度污染时,通知预警人员和检测人员,当水质为重度污染时,通知行政人员以及预警人员和检测人员。水质污染的状态发生变化,通知的人员也发生相应的变化,适合用观察者模式。
代码示例
首先定义观察者接口,这里增加了对观察者职务的获取和设置。
package observer;public interface Watcher { public void setJob(String job); //获取观察人员的职务 public String getJob(); public void update(Subject subject);}
观察者具体实现类
package observer;public class ConcretWatcher implements Watcher { private String job; @Override public void setJob(String job) { // TODO 自动生成的方法存根 this.job = job; } @Override public String getJob() { // TODO 自动生成的方法存根 return job; } @Override public void update(Subject subject) { System.out.println(getJob() +"得到通知,水质等级是"+subject.getPollutionLevel()); }}
定义目标的父对象,这里使用抽象方法。
package observer;import java.util.List;import java.util.ArrayList;public abstract class Subject { protected List<Watcher> list = new ArrayList<>(); //获取水质污染等级 public abstract int getPollutionLevel(); public abstract void notifyWatcher(); public abstract void setPollutionLevel(int level); public boolean attach(Watcher watcher) { return list.add(watcher); } public boolean detach(Watcher watcher{ return list.remove(watcher); }}
具体的派生类
package observer;import java.util.ArrayList;import java.util.List;public class WaterQuality extends Subject { private int pollutionLevel = 0; public int getPollutionLevel() { return pollutionLevel; } @Override public void notifyWatcher() { // TODO 自动生成的方法存根 for (Watcher watcher:list) { if (pollutionLevel >= 0) { if (watcher.getJob().equals("检测人员")) { watcher.update(this); } } if (pollutionLevel >= 1) { if (watcher.getJob().equals("预警人员")) { watcher.update(this); } } if (pollutionLevel >= 2) { if (watcher.getJob().equals("行政人员")) { watcher.update(this); } } } } public void setPollutionLevel(int level) { this.pollutionLevel = level; this.notifyWatcher(); }}
客户端的代码
package observer;public class Client { public static void main(String[] args) { Subject subject = new WaterQuality(); Watcher watcher1 = new ConcretWatcher(); watcher1.setJob("检测人员"); Watcher watcher2 = new ConcretWatcher(); watcher2.setJob("预警人员"); Watcher watcher3 = new ConcretWatcher(); watcher3.setJob("行政人员"); subject.attach(watcher1); subject.attach(watcher2); subject.attach(watcher3); System.out.println("当水为清澈的时候:"); subject.setPollutionLevel(0); System.out.println("当水为轻度污染时:"); subject.setPollutionLevel(1); System.out.println("当水为重度污染时:"); subject.setPollutionLevel(2); }}
运行结果:
当水为清澈的时候:
检测人员得到通知,水质等级是0
当水为轻度污染时:
检测人员得到通知,水质等级是1
预警人员得到通知,水质等级是1
当水为重度污染时:
检测人员得到通知,水质等级是2
预警人员得到通知,水质等级是2
行政人员得到通知,水质等级是2
阅读全文
0 0
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 欢迎使用CSDN-markdown编辑器
- 树莓派开机启动python脚本的另一种方法【转】
- 寒假学习之stm32(13)----ADC(模数转换)
- 8. String to Integer (atoi)
- 如何用TensorFlow训练和识别/分类自定义图片
- 设计模式之观察者模式
- LWC 51:682. Baseball Game
- Unix网络编程思想
- CVE-2017-8759
- 本科应届毕业生笔试面试分享
- 输入4个整数,要求按由小到大的顺序输出;
- 实验一线性表的基本操作实现及其应用
- offer31--连续子数组的最大和
- 鼠标点是否在图形区域的判断