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

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

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;//不断地声明变量来维护肯定是不行的.*/          //人     //用集合来传很多人进去.     //该集合中存储的都是需要收听天气预报的人     //ArrayList
list = new ArrayList
(); //ArrayList
list = new ArrayList(); //程序设计讲究低耦合----->尽量不要让一个类过分依赖于另外一个类.. //现在WeatherStation非常依赖Emp.如果某一天Emp被删除掉了,WeatherStation就出问题了.这两个类之间的耦合性是非常高的. //程序设计要低耦合,再维护多一个集合也是于事无补的东西.可以再搞多一个对象的. //中国移动不会给每个人发天气预报,短信回复XX信息给10086订阅天气预报,中国移动就会每个月给你发天气预报.这个规则是移动来定的. //气象站要主动地通知人来更新天气.气象站有资格能定义一些订阅天气预报的规则.作为发布者肯定有资格定一些规则.谁想收听天气预报就要遵守我的规则. //就像中国移动,想收听天气预报就要遵守移动的规则,发送xxxxx到10086.这个时候接口就派上用场了. //如果这里多维护一个学生的集合,程序的扩展性不高,维护非常不方便... ArrayList
list = new ArrayList
();//传入接口做参数 这就是接口的好处 解耦 //你是写WeatherStation的人,那么你就有资格定义规则给Emp或者Student走.这个接口不会是其他人去写的.你应该不会自己害自己吧. //这就是程序的解耦.用上了这个接口给它们定义了一个规范之后,即使你多加一个群体, /* public WeatherStation(Emp e) { this.e = e; }*//* public void addListener(Emp e){ list.add(e); }*/ public void addListener(Weather w){ list.add(w); } //开始工作 public void startWork() throws InterruptedException{ //不同代码同时执行 new Thread(){ @Override public void run() { //有一段线程单独服务这一段代码了. while(true){ Random random = new Random(); updateWeather();//每1~1.5秒更新一次天气 1000~1500 //天气更新的时候,遍历这个集合,挨个挨个地通知他们 /* for (Emp e : list) { //for (Object e : list) { e.notifyWeather(weather); } */ for (Weather w : list) { //for (Object e : list) { w.notifyWeather(weather); } //e.notifyWeather(weather); int s =random.nextInt(501)+1000; //0~500+1000=1500 //假如这里产生的随机数是500,那边产生的随机数是1500,发生随机数不一致的问题 try { Thread.sleep(s); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); //为这段代码分配一段线程 /* while(true){ Random random = new Random(); updateWeather();//每1~1.5秒更新一次天气 1000~1500 int s =random.nextInt(501)+1000; //0~500+1000=1500 Thread.sleep(s); }*/ } //更新天气的方法 public void updateWeather(){ Random random = new Random(); int index = random.nextInt(weathers.length); weather = weathers[index]; System.out.println("当前的天气是:"+ weather); }}
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);        }        */    //应该是由气象站主动地通知人的,而不是由人主动地关注天气的.        //更不更新天气气象站最清楚.气象站广播天气.                    }}

 

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6734313.html

你可能感兴趣的文章
sqoop数据导入到Hdfs 或者hive
查看>>
AWS国际版的Route 53和CloudFront
查看>>
bzoj 2456: mode【瞎搞】
查看>>
bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】
查看>>
excel动态去重和动态排序
查看>>
走进异步世界-犯傻也值得分享:ConfigureAwait(false)使用经验分享
查看>>
sql2000执行sql2005导出的数据脚本时出现“提示含有超过64K限度的行”(转)
查看>>
设计模式(20)-----迭代器模式
查看>>
AutoCAD.NET二次开发:创建自定义菜单(AcCui)
查看>>
NHibernate的调试技巧和Log4Net配置
查看>>
foreach和List.Foreach 退出循环相关问题
查看>>
数据转换
查看>>
同源策略
查看>>
WPF : ListBox的几种Template属性
查看>>
DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制
查看>>
WPF绘制矢量图形模糊的问题
查看>>
TemplatePart用法说明
查看>>
HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性、非功能性、关键约束)-上篇...
查看>>
intellij idea 常用快捷键 使用技巧
查看>>
关于v$datafile中system表空间的status值始终为system
查看>>