• 观察者模式(转)


     1 package cn.itcast.observer;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Random;
     5 /*
     6  观察者设计模式:观察者设计模式解决的问题时当一个对象发生指定的动作时,要通过另外一个对象做出相应的处理。
     7  
     8 需求: 编写一个气象站、一个工人两个类,当气象站更新天气 的时候,要通知人做出相应的处理。
     9   
    10 
    11  问题1: 气象站更新了多次天气,然后人才做一次的处理。
    12  
    13 问题2: 目前气象站只能通知一个人而已。
    14 
    15 问题3: 在现实生活中出了工人群体要关注天气,其他 的群体也需要关注天气
    16 
    17 
    18 观察者设计模式的步骤:
    19     1. 当前目前对象发生指定的动作是,要通知另外一个对象做出相应的处理,这时候应该把对方的相应处理方法定义在接口上。
    20     2. 在当前对象维护接口的引用,当当前对象发生指定的动作这时候即可调用接口中的方法了。
    21 
    22 
    23  */
    24 
    25 //气象站
    26 public class WeatherStation {
    27     
    28     String[] weathers = {"晴天","雾霾","刮风","冰雹","下雪"};
    29     
    30     //当前天气
    31     String  weather ;
    32     
    33     //该集合中存储的都是需要收听天气预报的人
    34     ArrayList<Weather> list = new ArrayList<Weather>();  //程序设计讲究低耦合---->尽量不要让一个类过分依赖于另外一个类。
    35     
    36     
    37     
    38     public void addListener(Weather e){
    39         list.add(e);
    40     }
    41     
    42     
    43     //开始工作
    44     public void startWork() {
    45         final Random random = new Random();
    46         
    47         new Thread(){    
    48             @Override
    49             public void run() {
    50                 while(true){ 
    51                     updateWeather(); // 每1~1.5秒更新一次天气  1000~1500
    52                     for(Weather e : list){
    53                         e.notifyWeather(weather);
    54                     }
    55 
    56                     int  s = random.nextInt(501)+1000; //  500
    57                     try {
    58                         Thread.sleep(s);
    59                     } catch (InterruptedException e) {
    60                         e.printStackTrace();
    61                     }
    62                 }                
    63             }
    64             
    65         }.start();
    66         
    67     }
    68     
    69     
    70     
    71     //更新天气的 方法
    72     public void updateWeather(){
    73         Random random = new Random();
    74         int index = random.nextInt(weathers.length);
    75         weather = weathers[index];
    76         System.out.println("当前的天气是: " + weather);
    77     }
    78     
    79 }
    1 package cn.itcast.observer;
    2 
    3 //订阅天气预报的接口
    4 public interface Weather {
    5     
    6     
    7     public void notifyWeather(String weather);
    8 
    9 }
     1 package cn.itcast.observer;
     2 
     3 import java.util.Random;
     4 
     5 public class WeatherMain {
     6 
     7     public static void main(String[] args) throws Exception {
     8         //工人
     9         Emp e = new Emp("小明");
    10         Emp e2 = new Emp("如花");
    11         
    12         //学生
    13         Student s1 = new Student("狗娃");
    14         Student s2 = new Student("狗剩");
    15         
    16         
    17         WeatherStation station = new WeatherStation();
    18         station.addListener(e);
    19         station.addListener(e2);
    20         station.addListener(s1);
    21         station.addListener(s2);
    22         
    23         
    24         
    25         station.startWork();
    26         
    27         
    28     }
    29     
    30 }
    package cn.itcast.observer;
    
    //人 是要根据天气做出相应的处理的。
    public class Emp implements Weather{
        
        String name;
    
        public Emp(String name) {
            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+"戴着被子过来上班!");
            }
            
    
        }
    
    }
     1 package cn.itcast.observer;
     2 
     3 public class Student implements Weather{
     4     
     5     String name;
     6 
     7     public Student(String name) {
     8         super();
     9         this.name = name;
    10     }
    11     
    12     
    13     public void notifyWeather(String weather){
    14         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         }else if("下雪".equals(weather)){
    23             System.out.println(name+"等下完再去上学!");
    24         }
    25         
    26 
    27     }
    28     
    29 }
  • 相关阅读:
    [CF1051F] The Shortest Statement
    [国家集训队] 墨墨的等式
    [CF558E] A Simple Task
    [洛谷P1349] 广义斐波那契数列
    [TJOI2009] 猜数字
    [洛谷P3403] 跳楼机
    学习力
    启动流程
    《鸟哥Linux》笔记——磁盘分区
    indexDB数据库
  • 原文地址:https://www.cnblogs.com/Damon-Luo/p/5596251.html
Copyright © 2020-2023  润新知