观察者设计模式
有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
比如你有一个气象站,隔一段时间检测一次天气,检测完了需要通知有需求的人群,这些人群会即时根据天气做出相应的反应。而由于这些人群的属性不同,所以不能用一个类。此时,观察者设计模式就可以用了。
首先设计一个接口,封装的方法作用就是通知天气,并且做出相应的反应。
然后每一个有需求的人群类都继承和实现这个接口。
最后就是在气象站类中添加一个元素为接口类型的list,由于有需求的人群都继承了这个接口,所以不论是什么类型的人群,都可以添加到中一个list中,然后遍历通知就ok了
代码如下:
接口类
1 public interface Weather { 2 public void notifyWeather(String weather); 3 }
Emp.java 人群1
1 public class Emp implements Weather{ 2 3 String name; 4 5 public Emp(String name) { 6 this.name = name; 7 } 8 9 10 //人是要根据天气做出相应的处理的。 "晴天","雾霾","刮风","冰雹","下雪" 11 public void notifyWeather(String weather){ 12 if("晴天".equals(weather)){ 13 System.out.println(name+"高高兴兴的去上班!!"); 14 }else if("雾霾".equals(weather)){ 15 System.out.println(name+"戴着消毒面具去上班!"); 16 }else if("刮风".equals(weather)){ 17 System.out.println(name+"拖着大石头过来上班!"); 18 }else if("冰雹".equals(weather)){ 19 System.out.println(name+"戴着头盔过来上班!"); 20 }else if("下雪".equals(weather)){ 21 System.out.println(name+"戴着被子过来上班!"); 22 } 23 24 25 } 26 27 }
Student.java 人群2
1 public class Student implements Weather{ 2 3 String name; 4 5 public Student(String name) { 6 super(); 7 this.name = name; 8 } 9 10 11 public void notifyWeather(String weather){ 12 if("晴天".equals(weather)){ 13 System.out.println(name+"高高兴兴的去开学!!"); 14 }else if("雾霾".equals(weather)){ 15 System.out.println(name+"吸多两口去上学!"); 16 }else if("刮风".equals(weather)){ 17 System.out.println(name+"在家睡觉!"); 18 }else if("冰雹".equals(weather)){ 19 System.out.println(name+"在家睡觉!"); 20 }else if("下雪".equals(weather)){ 21 System.out.println(name+"等下完再去上学!"); 22 } 23 24 25 } 26 27 }
气象站类
1 public class WeatherStation { 2 3 String[] weathers = {"晴天","雾霾","刮风","冰雹","下雪"}; 4 5 //当前天气 6 String weather ; 7 8 //该集合中存储的都是需要收听天气预报的人 9 ArrayList<Weather> list = new ArrayList<Weather>(); //程序设计讲究低耦合---->尽量不要让一个类过分依赖于另外一个类。 10 11 public void addListener(Weather e){ 12 list.add(e); 13 } 14 15 //开始工作 16 public void startWork() { 17 final Random random = new Random(); 18 19 new Thread(){ 20 @Override 21 public void run() { 22 while(true){ 23 updateWeather(); // 每1~1.5秒更新一次天气 1000~1500 24 for(Weather e : list){ 25 e.notifyWeather(weather); 26 } 27 28 int s = random.nextInt(501)+1000; // 500 29 try { 30 Thread.sleep(s); 31 } catch (InterruptedException e) { 32 e.printStackTrace(); 33 } 34 } 35 } 36 37 }.start(); 38 39 } 40 //更新天气的 方法 41 public void updateWeather(){ 42 Random random = new Random(); 43 int index = random.nextInt(weathers.length); 44 weather = weathers[index]; 45 System.out.println("当前的天气是: " + weather); 46 } 47 48 }
主类:
1 public class WeatherMain { 2 3 public static void main(String[] args) throws Exception { 4 //工人 5 Emp e = new Emp("AA"); 6 Emp e2 = new Emp("BB"); 7 8 //学生 9 Student s1 = new Student("CC"); 10 Student s2 = new Student("DD"); 11 12 WeatherStation station = new WeatherStation(); 13 station.addListener(e); 14 station.addListener(e2); 15 station.addListener(s1); 16 station.addListener(s2); 17 18 station.startWork(); 19 } 20 21 }