场景
设计模式-观察者模式在Java中的使用示例:
设计模式-观察者模式在Java中的使用示例_java观察者模式实例
上面讲的观察者模式的一个示例,下面记录摘自软件设计师案例分析的一个示例-环境监测系统。
观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
Observer模式适用于
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立对象中以使它们可以各自单独地改变和复用
2、当对一个对象的改变需要同时改变其他对象,而不知道具体由多少对象有待改变时
3、当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即:不希望这些对象是紧耦合的
观察者模式角色:
Subject:
抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,
抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteSubject:
具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,
给所有注册过的观察者发送通知。
Observer:
抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
ConcrereObserver:
具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
注:
博客:
实现
某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及清洁度等环境数据。
当获取到最新的环境监测数据时,显示的环境数据能够更新。
新建Subject抽象主题
public interface Subject {
//注册对主题感兴趣的观察者
public void registerObserver(Observer observer);
//删除观察者
public void removeObserver(Observer observer);
//当主题发生变化时通知观察者
public void notifyObserver();
}
新建抽象观察者
public interface Observer {
public void update(float temp,float humidity,float cleanness);
}
新建具体主题
import java.util.ArrayList;
public class EnvironmentData implements Subject{
private ArrayList observers;
private float temperature,humidity,cleanness;
public EnvironmentData(){
observers = new ArrayList();
}
@Override
publ服务器托管网ic void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObserver() {
f服务器托管网or (int i = 0; i
新建具体观察者
public class CurrentConditionsDisplay implements Observer{
private float temperature;
private float humidity;
private float cleanness;
private Subject envData;
public CurrentConditionsDisplay(Subject envData){
this.envData = envData;
envData.registerObserver(this);
}
@Override
public void update(float temperature, float humidity, float cleanness) {
this.temperature = temperature;
this.humidity = humidity;
this.cleanness = cleanness;
display();
}
public void display(){
//代码省略
}
}
客户端调用
public class EnvironmentMonitor {
public static void main(String[] args) {
EnvironmentData envData = new EnvironmentData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(envData);
envData.setMeasurements(80,60,50);
}
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 【动画进阶】神奇的背景,生化危机4日食 Loading 动画还原
最近,在 Steam 玩一款老游戏(生化危机 4 重置版),其中,每当游戏转场的过程中,都有这么一个有趣的 Loading 动画: 整个效果有点类似于日食效果,中间一圈黑色,向外散发着太阳般的光芒。 本文,我们将尝试使用 CSS,还原这个效果。 整个效果做出来…