观察者模式
观察者模式可以应用在很多场景:
观察者模式的优点:1.观察者与目标之间实现了抽象的耦合 2.观察者模式实现了动态联动 3.观察者模式可实现广播模式
观察者模式的缺点:可能会引起许多无谓的操作。
不管怎么说观察者模式还是应用与我们的生活场景中,其中优点还是大于缺点的。
观察者模式所涉及的角色有:
● 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
● 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
● 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
● 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
1 * 具体的观察对象,实现更新的方法,使自身的状态和目标的状态保持一致 2 * 3 * */ 4 public class ConcrateSubject extends Subject{ 5 6 //目标对象的状态 7 private String subjectState; 8 9 public String getSubjectState() { 10 return subjectState; 11 } 12 13 public void setSubjectState(String State) { 14 this.subjectState = State; 15 System.out.println("Subject:"+subjectState); 16 this.notifyObservers(subjectState); 17 18 } 19 public void setSubjectState_Object(String newState){ 20 System.out.println("Subject:"+newState); 21 this.subjectState = newState; 22 this.notifyObservers_Object(); 23 }
1 package com.pt; 2 3 public class ConcrateObserver implements Observer{ 4 5 private String observerState; 6 @Override 7 public void update(String state) { 8 // TODO Auto-generated method stub 9 observerState = state; 10 System.out.println("Observer:"+state); 11 } 12 13 //这是通过拉取主题对象中的信息 14 @Override 15 public void update_Subject(Subject subject) { 16 // TODO Auto-generated method stub 17 //更新观察者的状态,使其与目标的状态保持一致 18 observerState = ((ConcrateSubject)subject).getSubjectState(); 19 System.out.println("observer:"+observerState); 20 } 21 22 }
1 package com.pt; 2 /* 3 * 这是一个观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象 4 * */ 5 public interface Observer { 6 /* 7 * 更新接口,传入目标对象,方便获取相应的目标对象的状态 8 * */ 9 10 public void update(String state); 11 12 /* 13 * 更新接口,传入目标对象,方便获取相应的目标对象的状态 14 * 15 * */ 16 public void update_Subject(Subject subject); 17 } 18 19 20 package com.pt; 21 22 import java.util.ArrayList; 23 import java.util.List; 24 25 /* 26 * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 27 * @author gerry 28 * */ 29 30 public class Subject { 31 /** 32 * detach attach notifyObserver 33 * */ 34 private List<Observer> observers = new ArrayList<Observer>(); 35 36 //增加观察者接口 37 public void attach(Observer observer){ 38 observers.add(observer); 39 System.out.println("Attch an observer"); 40 } 41 42 //删除集合中的指定观察者 43 public void datach(Observer observer){ 44 observers.remove(observer); 45 System.out.println("remove an observer"); 46 } 47 48 //通知所有注册的观察者,只有子类才可以使用 49 protected void notifyObservers(String state){ 50 //注入观察者 51 for(Observer observer : observers){ 52 observer.update(state); 53 } 54 } 55 56 protected void notifyObservers_Object(){ 57 for(Observer observer : observers){ 58 observer.update_Subject(this); 59 } 60 } 61 }
1 package com.pt; 2 3 import java.util.Observer; 4 5 public class ObserverMain { 6 7 public static void main(String[] args) { 8 ConcrateSubject subject = new ConcrateSubject(); 9 ConcrateObserver person = new ConcrateObserver(); 10 subject.attach(person); 11 subject.setSubjectState("房价上调50%"); 12 subject.setSubjectState_Object("房价下调30%"); 13 } 14 }