设计模式(11)- 观察者模式

观察者模式

1.定义

       定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖与它的对象都能得到通知并被自动更新。

2.示例代码

  

/*目标对象,它知道观察它的观察者,提供注册和删除观察者的接口*/
public class Subject{
    /*用来保存注册的观察者对象*/
    private List<Observer> observers = new ArrayList<Observer>();
    /*注册观察者*/
    public void attach(Observer observer){
        observers.add(observer);
    }
    /*删除观察者*/
    pubic void detach(Observer observer){
        observers.remove(observer);
    }
    /*通知所有注册的观察者对象*/
    protected void notifyObservers(){
       for(Observer observer){
          observer.update(this);
       }
    }
}

/*具体目标对象的定义*/
public class ConceteSubject extends Subject{
   /*示意目标对象的状态*/
   private String subjectState;
   public String getSubjectState(){
       return subjectState;
   }
   public void setSubjectState(String subjectState){
       this.subjectState = subjectState;
       //目标对象发生了改变,通知观察者
       this.notifyObservers();
   }
}

   

/*观察者接口定义*/
public interface Observer{
   /*更新的接口,同步目标对象状态*/
   public void update(Subject subject);
}

/*具体观察者实现*/
public class ConcreteObserver implements Observer{
    /*示意观察者的状态*/
    private String observerState;
    public String getObserverState(){
       return observerState;
    }
    public void update(Subject subject){
        observerState = (ConcreteSubject)subject.getSubjectState();
    }
}

   

/*客户端调用示意*/
public class Client{
   public static void main(String args[]){
       //创建被观察者对象
       ConcreteSubject subject = new ConcreteSubject ();
       //创建观察者对象
       Observer observer1 = new ConcreteObserver();
       Observer observer2 = new ConcreteObserver();
       Observer observer3 = new ConcreteObserver();
       //注册观察者
       subject.attach(observer1);
       subject.attach(observer2);
       subject.attach(observer3);
       //改变被观察者状态       
       subject.setSubjectState("1");
       //取得被观察者状态
       System.out.println("observer1 = " + observer1.getObserverState()); 
       System.out.println("observer2 = " + observer2.getObserverState()); 
       System.out.println("observer3 = " + observer3.getObserverState()); 
   }
}

3.实际应用

     观察者模式实现了观察者和目标对象之间的抽象耦合,实现了动态联动,支持广播通信。

观察者模式的本质:触发联动

猜你喜欢

转载自renhanxiang.iteye.com/blog/2407653