zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式属于一种行为型模式。

    观察者模式定义了一种对象间的一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

    菜鸟教程中的这幅图比较直观(说白了就是,目标对象中维护着一个list存放所有的观察者对象,所有的观察者对象实现同一个observer接口来实现解耦)

    下面举一个常见的气象站的例子,就是不同的人(学生,工人)收到天气预报的改变后作出相应的处理

    气象站对象(这个就相当于上图中的Subject,也就是目标对象)

    public class WeatherStation {
        
        String[] weathers = {"天晴", "下雨", "台风"};
        
        ArrayList<Person> list = new ArrayList<>();
        
        public void addPerson(Person person) {
            list.add(person);
        }
        
        
        public void updateWeather() throws InterruptedException {
            
            while(true) {
                Random random = new Random();
                String weather = weathers[random.nextInt(weathers.length)];
                System.out.println(weather);
                
                for(Person person: list) {
                    person.doSomething(weather);
                }
                
                long time = random.nextInt(501)+1000;
                Thread.sleep(time);
            }
            
           
            
        }
    }

    观察接口(也就是上图中的observer接口)

    public interface Person {
        
        void doSomething(String weather);
    }

    学生对象

    public class Student implements Person{
        
        String name;
        
        public Student(String name) {
            this.name = name;
        }
    
        @Override
        public void doSomething(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 + "不用上学!");
            }
        }
        
    }

    工人对象

    public class Worker implements Person{
        
        String name;
        
        public Worker(String name) {
            this.name = name;
        }
    
        @Override
        public void doSomething(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 + "不用上班!");
            }
        }
    
    }
  • 相关阅读:
    sqlplus -S选项说明
    oracle中常见set指令
    nohup详解
    centos64位编译32位程序
    【PHP系列】框架的抉择
    【PHP系列】PHP推荐标准之PSR-4,自动加载器策略
    【PHP系列】PHP推荐标准之PSR-3,日志记录器接口
    【PHP系列】PHP推荐标准之PSR-1,PSR-2
    【项目管理】管理工具的抉择 --- 持续更新中
    【CNMP系列】CentOS7.0下安装FTP服务
  • 原文地址:https://www.cnblogs.com/xtuxiongda/p/11109614.html
Copyright © 2011-2022 走看看