Observer观察者模式

一、首先要理解观察者模式

  1、设计思想: 定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都得到通知并被自动更新(也可以选择性的更新某个它所依赖的对象)。

  2、观察者模式中主要有观察者和被观察者2个对象

    观察者(Observer):为那些在目标发生改变时需获得通知的对象定义个更新的接口,观察者可以有多个,实现了该接口的类都属于观察者

    被观察者(Observable):观察者所关注的目标,可以有任意多个观察者观察同一个目标

 

二、代码解释

  挺多人喜欢把MyOberable和MyOberver分开写,个人喜欢写在一起

public interface MyOberable {
 /*
  * 被观察者
  */
 public interface MyOberver {// 观察者,需要用到观察者模式的类需实现此接口
  // 具体观察者在得知被观察者状态改变时进行处理
  public void update(int what,Object... objs);

   //int what是用来选择性的通知某个观察这,去掉的话就是通知所有的观察者
 }

 public void attachObserver(MyOberver oberver);//注册观察者

 public void detachObserver(MyOberver oberver);//删除观察者

 public void notfilyObserver(int what,Object... objs);//通知观察者

 //int what是用来选择性的通知某个观察这,去掉的话就是通知所有的观察者

 public void detachObservers();//删除所有的观察者
}

 

import java.util.ArrayList;

/**
 * 具体被观察者并实现其抽象接口抽象被观察者
 *
 **/

public class MyConcreteOberable implements MyOberable {
 // 定义一个List来封装观察者MyOberver
 private ArrayList<MyOberver> oberverlist = new ArrayList<MyOberver>();

 /**
  * Attach Observer (注册观察者) oberver必须不为空,不然会抛出NullPointerException
  * */
 @Override
 public void attachObserver(MyOberver oberver) {
  if (oberver == null)
   throw new NullPointerException();
  synchronized (oberverlist) {
   if (!oberverlist.contains(oberver)) {
    oberverlist.add(oberver);
   }
  }
 }

 /**
  * Detach Observer (删除观察者)
  * */
 @Override
 public synchronized void detachObserver(MyOberver oberver) {
  oberverlist.remove(oberver);
 }

 /**
  * 通知观察者数据发生变化
  * */
 @Override
 public void notfilyObserver(int what, Object... objs) {
  if (oberverlist != null) {
   for (MyOberver obser : oberverlist) {
    obser.update(what, objs);
   }
  }
 }

 @Override
 public void detachObservers() {
  oberverlist.clear();
  oberverlist = null;
 }

}

 

import android.os.Bundle;  

import android.app.Activity;  

import android.view.Menu;  

  

public class MainActivity extends Activity {  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

          

        //实现一个被观察者实例  

        MyConcreteOberable Oberable= new MyConcreteOberable();  

        //实例3个观察者对被观察者进行观察  

        MyOberver1 Oberver1= new MyOberver1(); //  MyOberver1实现了MyOberver

        MyOberver2 Oberver2= new MyOberver2(); //  MyOberver2实现了MyOberver

        //加入对其观察  

        Oberable.attachObserver(Oberver1);

        Oberable.attachObserver(Oberver2);

        //当被观察者发生变化时调用其信息方法  

        Oberable.notfilyObserver(1,"1表示选择通知Oberver1");

    }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章