设计模式-观察者模式
观察者模式简介
定义:属于对象行为型模式,多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
目的:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作
优点:降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系,符合依赖倒置原则
目标与观察者之间建立了一套触发机制
缺点:目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用
当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率
观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化
实现
角色:抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法
具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象
抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用
具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态
代码:
1 /**抽象主题**/ 2 public abstract class Subject { 3 //JAVA 中已经有了对观察者模式的支持类,用List泛型来存放观察者 4 protected List<Observer> list = new ArrayList<Observer>(); 5 /**添加观察者**/ 6 public void add(Observer observer){ 7 list.add(observer); 8 } 9 /**删除观察者**/ 10 public void remove(Observer observer){ 11 list.remove(observer); 12 } 13 /**通知观察者的方法**/ 14 abstract void notifyObserver(); 15 16 } 17 18 /**具体主题**/ 19 public class ConcreteSubject extends Subject{ 20 21 @Override 22 void notifyObserver() { 23 // TODO Auto-generated method stub 24 System.out.println("具体主题发生变化,通知观察者"); 25 System.out.println("-------------------------"); 26 for(Observer o : list ){ 27 o.respon(); 28 } 29 } 30 31 } 32 33 /**抽象观察者**/ 34 public interface Observer { 35 public void respon(); 36 } 37 38 /**具体观察者A**/ 39 public class ConcreteObserverA implements Observer{ 40 @Override 41 public void respon(){ 42 System.out.println("A发现变化作出反应"); 43 44 } 45 } 46 47 /**具体观察者B**/ 48 public class ConcreteObserverB implements Observer { 49 50 @Override 51 public void respon() { 52 // TODO Auto-generated method stub 53 System.out.println("B发现变化作出反应"); 54 } 55 56 } 57 58 /**测试方法**/ 59 public class Test { 60 61 public static void main(String[] args) { 62 // TODO Auto-generated method stub 63 Subject subject = new ConcreteSubject(); 64 Observer observerA = new ConcreteObserverA(); 65 Observer observerB = new ConcreteObserverB(); 66 subject.add(observerA); 67 subject.add(observerB); 68 69 subject.notifyObserver(); 70 } 71 72 } 73 74 测试结果: 75 具体主题发生变化,通知观察者 76 ------------------------- 77 A发现变化作出反应 78 B发现变化作出反应