package cn.itcast.observer;//人 是要根据天气做出相应的处理的。"晴天","雾霾","刮风","冰雹","下雪"//天气怎么来呢?//public class Emp { public class Emp implements Weather{ String name; public Emp(String name) { super(); this.name = name; } //人 是要根据天气做出相应的处理的。"晴天","雾霾","刮风","冰雹","下雪" //人可以根据天气做出相应的处理 public void notifyWeather(String weather){ if("晴天".equals(weather)){ System.out.println(name+"高高兴兴的去上班!!!!!"); }else if("雾霾".equals(weather)){ System.out.println(name+"戴着消毒面具去上班!!!!!"); }else if("刮风".equals(weather)){ System.out.println(name+"拖着大石头过来上班!!!!"); }else if("冰雹".equals(weather)){ System.out.println(name+"戴着头盔过来上班!!!!!!"); }else if("下雪".equals(weather)){ System.out.println(name+"戴着被子过来上班!!!!"); } } }
package cn.itcast.observer;public class Student implements Weather{ String name; public Student(String name) { super(); this.name = name; } //人 是要根据天气做出相应的处理的。"晴天","雾霾","刮风","冰雹","下雪" //人可以根据天气做出相应的处理 public void notifyWeather(String weather){ if("晴天".equals(weather)){ System.out.println(name+"高高兴兴的去开学!!!!!"); }else if("雾霾".equals(weather)){ System.out.println(name+"吸多两口去上学!!!!!"); }else if("刮风".equals(weather)){ System.out.println(name+"在家睡觉!!!"); }else if("冰雹".equals(weather)){ System.out.println(name+"在家睡觉!!!!"); }else if("下雪".equals(weather)){ System.out.println(name+"等下完再去上学!!!!"); } }}
package cn.itcast.observer;//订阅天气预报的接口...//谁都可以收听天气预报,谁想收听就来实现我这个接口.我定义规则,你们照着走.//接口在这里就充当了一个中介的模式了.特别是安卓用的特别的多.做一个下载,下载完之后要给某某地方发送一个通知.//这时候就要想到观察者设计模式,想到我们的接口的实现.public interface Weather { public void notifyWeather(String weather);//这个接口里面就维护着一个方法.}
package cn.itcast.observer;import java.util.ArrayList;import java.util.Random;/* * * 观察者设计模式: 观察者设计模式解决的问题时当一个对象发生指定的动作时,要通过另外一个对象做出相应的处理。 * * 需求:天气预报的.编写一个气象站、一个工人两个类,当气象站更新天气的时候,要通知人做出相应的处理. * * 问题1:气象站更新了多次天气,然后人才做一次的处理. * * 问题2:目前气象站只能通知一个人而已。 * * 问题3:在现实生活中除了工人群体要关注天气,其他的群体也需要关注天气的. * 事件监听,当一个按钮被点击的时候,它就会调用到一个对应的方法。 * 观察者设计模式的步骤: * 1. 当前目前对象发生指定的动作是,要通知另外一个对象做出相应的处理,这时候应该把对方的相应处理方法定义在接口上.这时候定义一个接口,把要通知它的一个行为定义成一个接口.把这种行为声明在一个接口上面. * 2. 在当前对象维护接口的引用,当当前对象发生指定的动作这时候可调用接口中的方法了。 * *///气象站public class WeatherStation { String[] weathers = {"晴天","雾霾","刮风","冰雹","下雪"}; //当前天气 String weather;/* //人 Emp e; Emp e2;//不断地声明变量来维护肯定是不行的.*/ //人 //用集合来传很多人进去. //该集合中存储的都是需要收听天气预报的人 //ArrayListlist = new ArrayList (); //ArrayList
package cn.itcast.observer;import java.util.Random;public class WeatherMain { public static void main(String[] args) throws Exception { //WeatherStation station = new WeatherStation(); //工人 Emp e = new Emp("小明"); Emp e2 = new Emp("如花"); //学生 Student s1 = new Student("狗娃"); Student s2 = new Student("狗剩"); //WeatherStation station = new WeatherStation(e); WeatherStation station = new WeatherStation(); station.addListener(e); station.addListener(e2); station.addListener(s1); station.addListener(s2); /*station.addListener(s1); station.addListener(s2);*/ //Object更恶心,如果传个狗给你呢?气象站会通知狗的吗? //station.addListener(new Dog()); station.startWork();//因为startWork()是while(true),startwWork()永远都干不完,代码永远都下不来 /* //工人 Emp e = new Emp("小明"); //e.notifyWeather(station.weather); //气象站不断地更新天气,人也要不断地关注天气,做出相应的处理。 Random random = new Random(); while(true){//不停地关注,关注是不是有点频繁啊。 e.notifyWeather(station.weather); int s = random.nextInt(501)+1000;//这边产生的随机数是1500的话 Thread.sleep(s); } */ //应该是由气象站主动地通知人的,而不是由人主动地关注天气的. //更不更新天气气象站最清楚.气象站广播天气. }}