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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_16658263/article/details/89302564

什么是观察者模式

观察者模式(Observer),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。

模式的职责

模式的职责

观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。

实现有两种方式:

推:每次都会把通知以广播的方式发送给所有观察者,所有的观察者只能被动接收。

拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。

模式的实现

//观察者的接口,用来存放观察者共有方法

public interface Observer {

   // 观察者方法

     void update(Subjecct subjecct);

}

 

//观察对象的父类

public class Subjecct {

     //观察者的存储集合

     private List<Observer> list = newArrayList<>();

 

     // 注册观察者方法

     public voidregisterObserver(Observer obs) {

           list.add(obs);

     }

    // 删除观察者方法

     public voidremoveObserver(Observer obs) {

           list.remove(obs);

           this.notifyAllObserver();

     }

 

     // 通知所有的观察者更新

     public void notifyAllObserver() {

           for (Observer observer : list) {

                observer.update(this);

           }

     }

 

}

//具体观察者对象的实现

public class RealObserver extendsSubjecct {

    //被观察对象的属性

      private int state;

      public int getState(){

            return state;

      }

      public void  setState(int state){

            this.state=state;

            //主题对象(目标对象)值发生改变

            this.notifyAllObserver();

      }

     

}

public class Client {

 

     public static void main(String[] args) {

           // 目标对象

           RealObserver subject = newRealObserver();

           // 创建多个观察者

           ObserverA obs1 = newObserverA();

           ObserverA obs2 = newObserverA();

           ObserverA obs3 = newObserverA();

           // 注册到观察队列中

           subject.registerObserver(obs1);

           subject.registerObserver(obs2);

           subject.registerObserver(obs3);

           // 改变State状态

           subject.setState(300);

           System.out.println(obs1.getMyState());

           System.out.println(obs2.getMyState());

           System.out.println(obs3.getMyState());

           // 改变State状态

           subject.setState(400);

           System.out.println(obs1.getMyState());

           System.out.println(obs2.getMyState());

           System.out.println(obs3.getMyState());

     }

 

}

 

 

观察者模式应用场景

关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。

事件多级触发场景。

跨系统的消息交换场景,如消息队列、事件总线的处理机制。

猜你喜欢

转载自blog.csdn.net/sinat_16658263/article/details/89302564