package day27;
import java.util.ArrayList;
import java.util.Random;
/*学习过观察者模式之后,因为是自动化专业出身的举个液位传感器测水位的例子,当水位超过预警线时,传感器通知控制器去关闭水阀。
这个例子中:传感器就相当于一个观察者。
观察者模式:观察者设计模式解决的是当一个对象发生指定动作时。要通知另一个动作去做出相应的处理,即水位超出警戒线传感器监测到异常从而通知控制器关闭水阀。
* */
//一、先定义一个控制器的接口类,便于通知不同类型的控制器类。
interface Controller {
public void notificationControner(int flag);
}
//Arm类的控制器(年轻有活力)
class Arm implements Controller{
@Override
public void notificationControner(int flag) {
if((flag%2)==0){
System.out.println("Arm ,水位超过警戒线了赶紧关闭水阀吧。。。。");
}else{
System.out.println("Arm,玩会游戏吧现在一切正常");
}
}
}
//AVR类的控制器(岁数大了 ,反应慢了)
class AVR implements Controller{
@Override
public void notificationControner(int flag) {
if((flag%2)==0){
System.out.println("AVR,水位过警戒线了,麻烦您老人家给关一下水阀吧!");
}else{
System.out.println("AVR,赶紧歇会吧,现在一切正常");
}
}
}
//二、在定义一个传感器类
class Sensor{
//记录当前水位状态
public static int flag = 0;
static ArrayList<Controller> arrayList = new ArrayList<Controller>();
//增加被通知的对象
public void addLisener(Controller controller){
arrayList.add(controller);
}
//传感器工作
public static void startWrok(){
new Thread(){
@Override
public void run() {
while(true){
Random random = new Random();
flag = random.nextInt(101);//产生0~100的随机数
if((flag%2)==0){
System.out.println("警告警告 水位超出警戒线");
}else{
System.out.println("现在一切正常");
}
//遍历集合中的每一个控制器,通知他们
for(Controller controller: arrayList){
controller.notificationControner(flag);
}
//休眠1~1.5秒 即1~1.5秒 更新一个状态
Random randomTime = new Random();
int time = randomTime.nextInt(501) + 1000;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}
public class ObserverDesign {
public static void main(String[] args){
//创建控制器对象
Arm arm = new Arm();
AVR avr = new AVR();
//创建传感器对象
Sensor sensor = new Sensor();
//添加接收信号的控制器对象
sensor.addLisener(arm);
sensor.addLisener(avr);
//启动传感器工作
sensor.startWrok();
}
}
自动化出身程序员结合实例谈观察者模式
最新推荐文章于 2020-12-18 17:12:44 发布