观察者模式

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

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

菜鸟教程中的这幅图比较直观(说白了就是,目标对象中维护着一个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 + "不用上班!");
        }
    }

}
posted @ 2019-06-30 14:24  xtu熊大  阅读(153)  评论(0编辑  收藏  举报