• 观察者模式


    观察者设计模式;当一个对象发生指定的动作时要通知另外一个对象作出相应的处理。Swing中事件监听就是典型的观察者设计模式。

    经典案例:天气预报

    观察者设计模式其实就是一种面向接口的编程方式,观察者设计模式的步骤:

    1、当目前对象发生制定动作时,要通知另外一个对象作出相应的处理,这时候应该对方的相应的处理方法定义在接口中。

    2、在当前对象维护接口的引用,当前对象发生指定的动作时,即可调用接口中的方法。

    3、被通知者所属的类,都应当实现那个接口,这个接口相当于一个中介。

    好好理解,观察者模式,以后的使用很多的。

      1 //天气接口:
      2 public interface Weather {
      3     public void notifyWeather(String weather);    // weather接口中只有这么一个接受天气的方法
      4 }
      5 //气象站:
      6 public class WeatherStation {
      7     String[] weathers = {"晴天", "雨天", "刮风", "下雪", "冰雹"};
      8     
      9     //当前的天气状况
     10     String weather = null;
     11     
     12     //谁订阅了天气预报,就添加到这里面
     13     ArrayList<Weather> list = new ArrayList<Weather>();
     14     //添加
     15     public void addListener(Weather w)
     16     {
     17         list.add(w);
     18     }
     19     
     20     
     21     //更新天气
     22     public void updateWether()
     23     {
     24         Random random = new Random();
     25         int index = random.nextInt(5);
     26         weather = weathers[index];
     27     }
     28     
     29     //开始工作
     30     public void startWork(){
     31         //工作应当是持续不断的 还有给别的携程工作的时间,所以应当使用多线程
     32         final Random random = new Random();
     33         new Thread()
     34         {
     35             @Override
     36             public void run() {
     37                 while(true)
     38                 {
     39                     updateWether();
     40                     
     41                     for (Weather w : list) {
     42                         w.notifyWeather(weather);
     43                     }
     44                     
     45                     //1-1.5s更新一次
     46                     int s = random.nextInt(501)+1000;
     47                     try {
     48                         Thread.sleep(s);
     49                     } catch (InterruptedException e) {
     50                         // TODO Auto-generated catch block
     51                         e.printStackTrace();
     52                     }
     53                 }
     54             }
     55         }.start();
     56     }
     57 }
     58 //学生类:
     59 public class Student implements Weather{
     60     String name;
     61 
     62     public Student(String name) {
     63         this.name = name;
     64     }
     65 
     66     @Override
     67     //"晴天", "雨天", "刮风", "下雪", "冰雹"
     68     public void notifyWeather(String weather) {
     69         // TODO Auto-generated method stub
     70         if("晴天".equals(weather))
     71         {
     72             System.out.println(this.name+weather+" 上学去");
     73         }else if("雨天".equals(weather))
     74         {
     75             System.out.println(this.name+weather+" 带上伞");
     76         }else if("刮风".equals(weather))
     77         {
     78             System.out.println(this.name+weather+" 穿厚一点");
     79         }
     80         else if("下雪".equals(weather))
     81         {
     82             System.out.println(this.name+weather+" 不骑车");
     83         }else if("冰雹".equals(weather))
     84         {
     85             System.out.println(this.name+weather+" 不出门");
     86         }    
     87     }    
     88 }
     89 //驱动程序:
     90 public class WeatherMain {
     91     public static void main(String[] args) {
     92         WeatherStation station = new WeatherStation();
     93         
     94         Student s1 = new Student("小名");
     95         Student s2 = new Student("小红");
     96         
     97         station.addListener(s1);
     98         station.addListener(s2);
     99         
    100         station.startWork();
    101     }
    102 }
  • 相关阅读:
    webpack-dev-server 源码
    2021前端会有什么新的变化
    父类 超类 基类 子类 派生类
    Java的权限修饰符(public,private,protected,默认friendly)
    class修饰符public、private、protected、static、abstract
    hash和签名 、证书
    前端加密解密crypto
    appid app_key app_secret
    sdk开发 、sdk与插件的区别
    CF76C
  • 原文地址:https://www.cnblogs.com/OliverZhang/p/6027269.html
Copyright © 2020-2023  润新知