观察者模式
一、定义
观察者模式:
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式…(对象行为型模式)
二、特点
优点:
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
- 目标与观察者之间建立了一套触发机制。
缺点:
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
三、使用场景
- 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
- 当一个抽象模型有两个方面,其中-一个方面依赖于另一 方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
四、类图
模式的扩展:
在Java中,通过java.util.Observable-类和. java.util.Observer.接口定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例。
- Observable类
Observable-类是抽象目标类,它有一个Vector向量,用于保存所有要通知的观察者对象。
它最重要的3个方法:
void- addObserver(Observero)方法:用于将新的观察者对象添加到向量中;
void notifyObservers(Objectarg)方法:调用向量中的所有观察者对象的. update。通知它们数据发生改变,通常越晚加入向量的观察者越先得到通知;
voidsetChange()方法:用来设置一个boolean-类型的内部标志位,注明目标对象发生了变化。当它为真时,notifyObservers()才会通知观察者。 - Observer.接口
Observer.接口是抽象观察者,它监视目标对象的变化,当目标对象发生变化时,观察者得到通知,并调用void-update(Observable ,Objectarg)-方法,进行相应的工作。
五、实战代码
【SubjectS.java】
package Obv;
import java.util.ArrayList;
import java.util.List;
public abstract class SubjectS {
protected List <Observer0> observers;
public SubjectS(){
observers=new ArrayList<Observer0>();
}
public void Add(Observer0 observer){
observers.add(observer);
}
public void Remove(Observer0 observer){
observers.remove(observer);
}
public abstract void notifyObserver();
}
【ConcreteSubjectA.java】
package Obv;
public class ConcreteSubjectA extends SubjectS {
public ConcreteSubjectA(){
super();
}
@Override
public void notifyObserver() {
System.out.println("A目标发生改变了");
for(Observer0 obs:observers){
obs.response();
}
}
}
【ConcreteSubjectB.java】
package Obv;
public class ConcreteSubjectB extends SubjectS {
public ConcreteSubjectB(){
super();
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
System.out.println("B目标发生改变了");
for(Observer0 obs:observers){
obs.response();
}
}
}
【Observer0.java】
//为了避免与系统自有的同名的Observer冲突,加个0
package Obv;
public interface Observer0 {
void response(); //反应
}
【ConcreteObserver1.java】
package Obv;
public class ConcreteObserver1 implements Observer0{
public void response(){
System.out.println("目标变化了,1的反应");
}
}
【ConcreteObserver2.java】
package Obv;
public class ConcreteObserver2 implements Observer0 {
public void response() {
System.out.println("目标变化了,2的反应");
}
}
【ClientClass.java】
package Obv;
public class ClientClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
SubjectS subject=new ConcreteSubjectB();
Observer0 obs1=new ConcreteObserver1();
Observer0 obs2=new ConcreteObserver2();
subject.Add(obs1);
subject.Add(obs2);
subject.notifyObserver();
}
}
【运行截图】
喜欢的话记得点赞收藏哟😊
Java设计模式—博文专栏持续更新!