博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者设计模式
阅读量:4950 次
发布时间:2019-06-11

本文共 4018 字,大约阅读时间需要 13 分钟。

观察者设计模式

此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。

此种模式有时又被称为发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者<Dependents>模式)。

观察者设计模式通常透过呼叫各观察者所提供的方法来实现。通常被用来实作事件处理系统。有多个观察者时,不可以依赖特定的通知次序。

观察者设计模式的步骤:

    1. 当前对象发生指定的动作时,要通知另外一个对象做出相应的处理,这时候应该把对方的相应处理方法定义在接口上。
    2. 在当前对象维护接口的引用,当当前对象发生指定的动作这时候即可调用接口中的方法了。

代码示例:

1 //统一接口,来执行操作  2 public interface Weather {  3       4     public void notifyWeather(String weather);  5   6 }  7   8 //气象站  9 public class WeatherStation { 10      11     String[] weathers = {"晴天","雾霾","刮风","冰雹","下雪"}; 12     //当前天气 13     String  weather ; 14     //该集合中存储的都是需要收听天气预报的人 15     ArrayList
list = new ArrayList
(); //程序设计讲究低耦合---->尽量不要让一个类过分依赖于另外一个类。 16 17 public void addListener(Weather e){ 18 list.add(e); 19 } 20 21 //开始工作 22 public void startWork() { 23 final Random random = new Random(); 24 25 new Thread(){ 26 @Override 27 public void run() { 28 while(true){ 29 updateWeather(); // 每1~1.5秒更新一次天气 1000~1500 30 for(Weather e : list){ 31 e.notifyWeather(weather); 32 } 33 34 int s = random.nextInt(501)+1000; // 500 35 try { 36 Thread.sleep(s); 37 } catch (InterruptedException e) { 38 e.printStackTrace(); 39 } 40 } 41 } 42 43 }.start(); 44 45 } 46 47 //更新天气的 方法 48 public void updateWeather(){ 49 Random random = new Random(); 50 int index = random.nextInt(weathers.length); 51 weather = weathers[index]; 52 System.out.println("当前的天气是: " + weather); 53 } 54 } 55 56 //学生类 57 public class Student implements Weather{ 58 59 String name; 60 61 public Student(String name) { 62 super(); 63 this.name = name; 64 } 65 66 public void notifyWeather(String weather){ 67 if("晴天".equals(weather)){ 68 System.out.println(name+"高高兴兴的去开学!!"); 69 }else if("雾霾".equals(weather)){ 70 System.out.println(name+"吸多两口去上学!"); 71 }else if("刮风".equals(weather)){ 72 System.out.println(name+"在家睡觉!"); 73 }else if("冰雹".equals(weather)){ 74 System.out.println(name+"在家睡觉!"); 75 }else if("下雪".equals(weather)){ 76 System.out.println(name+"等下完再去上学!"); 77 } 78 } 79 } 80 //工人类 81 public class Emp implements Weather{ 82 83 String name; 84 85 public Emp(String name) { 86 this.name = name; 87 } 88 89 //人是要根据天气做出相应的处理的。 "晴天","雾霾","刮风","冰雹","下雪" 90 public void notifyWeather(String weather){ 91 if("晴天".equals(weather)){ 92 System.out.println(name+"高高兴兴的去上班!!"); 93 }else if("雾霾".equals(weather)){ 94 System.out.println(name+"戴着消毒面具去上班!"); 95 }else if("刮风".equals(weather)){ 96 System.out.println(name+"拖着大石头过来上班!"); 97 }else if("冰雹".equals(weather)){ 98 System.out.println(name+"戴着头盔过来上班!"); 99 }else if("下雪".equals(weather)){100 System.out.println(name+"戴着被子过来上班!");101 }102 }103 }104 105 //程序主类106 public class WeatherMain {107 public static void main(String[] args) throws Exception {108 //工人109 Emp e = new Emp("小明");110 Emp e2 = new Emp("如花");111 //学生112 Student s1 = new Student("狗娃");113 Student s2 = new Student("狗剩");114 //天气站115 WeatherStation station = new WeatherStation();116 station.addListener(e);117 station.addListener(e2);118 station.addListener(s1);119 station.addListener(s2);120 station.startWork();121 }122 }

 

转载于:https://www.cnblogs.com/nicker/p/6274465.html

你可能感兴趣的文章
【转】如何在 Windows 中执行干净启动
查看>>
MyBatis 缓存问题 session
查看>>
ThinkPHP框架知识的注意点
查看>>
平滑滤波(Smooth); java语言实现
查看>>
注意力的培养是学校教学的真正目的
查看>>
学习总结:机器学习(三)
查看>>
图论 邻接表实现 动态数组实现
查看>>
IP通信基础 第八周 第九周总结
查看>>
kali,parrot最新更新debain源
查看>>
平衡树学习笔记(2)-------Treap
查看>>
在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)
查看>>
./mosquitto_internal.h:51:12: fatal error: 'ares.h' file not found
查看>>
HDU 1789 Doing Homework again(非常经典的贪心)
查看>>
本机,同机房,同城,异地,不同城,腾讯云ping延时值
查看>>
jQuery小结5
查看>>
i=i+1与i+=1的区别及效率
查看>>
指令——mkdir
查看>>
Server.MapPath
查看>>
WPF日期控件
查看>>
基本的SqlPlus命令
查看>>