设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
观察者模式
有时又被称为
发布-订阅<Publish/Subscribe>模式、
模型-视图<Model/View>模式、
源-收听者<Source/Listener>模式
或从属者<Dependents>模式)
这是软件设计模式的一种。
观察者模式(Observer)完美的将观察者和被观察的对象分离开。
此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。
这通常透过呼叫各观察者所提供的方法来实现。
此种模式通常被用来实作事件处理系统。
有多个观察者时,不可以依赖特定的通知次序。
Swing大量使用观察者模式,许多GUI框架也是如此。
气象站:
public class WeatherStation { private String weather; String[] weathers = {"下雨","下雪","下冰雹","出太阳"}; static List<BookWeather> list = new ArrayList<BookWeather>(); Random random = new Random(); public void startWork(){ new Thread(){ @Override public void run() { while(true){ updateWeather(); try { Thread.sleep(random.nextInt(1000)+500); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } public void updateWeather(){ weather = weathers[random.nextInt(4)]; System.out.println("天气:"+ weather); } public String getWeather() { return weather; }
人:
public class Person implements BookWeather { String name; public Person(String name){ this.name = name; } private WeatherStation station ; public Person(String name,WeatherStation station){ this(name); this.station = station; } //下雨","下雪 ","下冰雹","出太阳" @Override public void notifyWeather() { String weather = station.getWeather(); 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+"嗮着太阳 上班"); } } }
测试类:
public class Test { public static void main(String[] args) throws InterruptedException { WeatherStation station = new WeatherStation(); station.startWork(); Person p1 = new Person("小明",station); while(true){ p1.notifyWeather(); Thread.sleep(2000); } }
问题:天气变化两三次,小明才知道一次。
解决方案 :
package cn.itcast.test; import java.util.List; import java.util.ArrayList; import java.util.Random; public class WeatherStation { private String weather; String[] weathers = {"下雨","下雪","下冰雹","出太阳"}; private static List<BookWeather> list = new ArrayList<BookWeather>(); Random random = new Random(); public void addListaner(BookWeather e){ list.add(e); } public void startWork(){ new Thread(){ @Override public void run() { while(true){ updateWeather(); try { Thread.sleep(random.nextInt(1000)+500); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } public void updateWeather(){ weather = weathers[random.nextInt(4)]; System.out.println("天气:"+ weather); for(BookWeather item : list){ item.notifyWeather(weather); } } public String getWeather() { return weather; }
人:
public class Person implements BookWeather { String name; public Person(String name){ this.name = name; } private WeatherStation station ; public Person(String name,WeatherStation station){ this(name); this.station = station; } //下雨","下雪 ","下冰雹","出太阳" @Override 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+"嗮着太阳 上班"); } }
接口:
public interface BookWeather { public void notifyWeather(String weather); }
public class Test { public static void main(String[] args) throws InterruptedException { WeatherStation station = new WeatherStation(); station.startWork(); Person p1 = new Person("小明"); Person p2 = new Person("小红"); Person p3 = new Person("小青 "); station.addListaner(p1); station.addListaner(p2); station.addListaner(p3); } }