观察者模式

定义

  定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新

结构

  在最基础的观察者模式中,包括以下四个角色:

  • 被观察者:从类图中可以看到,类中有一个用来存放观察者对象的Vector容器(之所以使用Vector而不使用List,是因为多线程操作时,Vector在是安全的,而List则是不安全的),这个Vector容器是被观察者类的核心,另外还有三个方法:attach方法是向这个容器中添加观察者对象;detach方法是从容器中移除观察者对象;notify方法是依次调用观察者对象的对应方法。这个角色可以是接口,也可以是抽象类或者具体的类,因为很多情况下会与其他的模式混用,所以使用抽象类的情况比较多。
  • 观察者:观察者角色一般是一个接口,它只有一个update方法,在被观察者状态发生变化时,这个方法就会被触发调用。
  • 具体的被观察者:使用这个角色是为了便于扩展,可以在此角色中定义具体的业务逻辑。
  • 具体的观察者:观察者接口的具体实现,在这个角色中,将定义被观察者对象状态发生变化时所要处理的逻辑。

类图

代码实现

观察者IObserver

public interface IObserver {
    
    void update(Subject subject);

}
View Code

 

被观察者Subject

import java.util.ArrayList;
import java.util.List;

public abstract class Subject {
    
    private Integer state;
    private List<IObserver> observers=new ArrayList<IObserver>();
    
    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public List<IObserver> getObservers() {
        return observers;
    }

    public void setObservers(List<IObserver> observers) {
        this.observers = observers;
    }

    public void rigister(IObserver observer){
        observers.add(observer);
    }
    
    public void remove(IObserver observer){
        observers.remove(observer);
    }
    
     public  void notifys(){
         for(int i=0 ; i<observers.size() ;i++ ){
             observers.get(i).update(this);
         }
     };

}
View Code

 

观察者具体实现

public class ObserverA implements IObserver{

    @Override
    public void update(Subject subject) {
        System.out.println(subject.getState());
    }

}
View Code

 

被观察者具体实现

public class ConcreateSubject extends Subject{
    
    public void setState (Integer state){
        super.setState(state);
        notifys();
    }

}
View Code

 

测试代码

public class Main {
    
    public static void main(String[] args) {
        ObserverA observer1=new ObserverA();
        ObserverA observer2=new ObserverA();
        ObserverA observer3=new ObserverA();
        
        ConcreateSubject subject=new ConcreateSubject();
        subject.rigister(observer1);
        subject.rigister(observer2);
        subject.rigister(observer3);
        
        subject.setState(2);
    }

}
View Code

 

posted @ 2018-06-01 21:53  小亮的BLOG  阅读(147)  评论(0编辑  收藏  举报