观察者模式用法

1、创建观察者IObserver接口

import android.os.Message;

public interface IObserver {
   abstract public void listen(Message inMessage);
}

2、创建被观察者ISubject接口

import android.os.Message;

public interface ISubject {
   public final static int FLAG_RUN_SYNC = 0;
   public final static int FLAG_RUN_MAIN_THREAD = 1;

   public boolean addObserver(IObserver inObserver);

   public boolean removeObserver(IObserver inObserver);

   public void notify(Message inMessage, int... flag);
}

3、创建绑定ObserverAdapter

import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

public class ObserverAdapter {
   private HashMap<ISubject, ArrayList<IObserver>> mSubjectObserverMap;

   @Override
   protected void finalize() throws Throwable {
      super.finalize();
      mHandler.removeMessages(0);
   }

   private class ObserverHandler extends Handler {
      public ObserverHandler(Looper looper) {
         super(looper);
      }

      public void handleMessage(Message msg) {
         Object[] objects = (Object[]) msg.obj;
         IObserver observer = (IObserver) objects[0];
         Message message = (Message) objects[1];
         observer.listen(message);
      }
   }

   private static class SafeInstanceHolder {
      public static ObserverAdapter sInstance = new ObserverAdapter();
   }

   public static synchronized ObserverAdapter getInstance() {
      return SafeInstanceHolder.sInstance;
   }

   private ObserverHandler mHandler = null;

   private ObserverAdapter() {
      mSubjectObserverMap = new HashMap<ISubject, ArrayList<IObserver>>();
      mHandler = new ObserverHandler(Looper.getMainLooper());
   }

   public synchronized boolean register(ISubject inSubject,
         IObserver inObserver) {
      boolean ret = false;
      if (mSubjectObserverMap.containsKey(inSubject)) {
         ArrayList<IObserver> list = mSubjectObserverMap.get(inSubject);
         if (!list.contains(inObserver)) {
            list.add(inObserver);
            ret = true;
         }
      } else {
         ArrayList<IObserver> list = new ArrayList<IObserver>();
         list.add(inObserver);
         mSubjectObserverMap.put(inSubject, list);
         ret = true;
      }
      return ret;
   }

   public synchronized boolean unregister(ISubject inSubject,
         IObserver inObserver) {
      if (mSubjectObserverMap.containsKey(inSubject)) {
         ArrayList<IObserver> list = mSubjectObserverMap.get(inSubject);
         list.remove(inObserver);
         if (list.size() <= 0) {
            mSubjectObserverMap.remove(inSubject);
         }
      }
      return true;
   }

   public synchronized void clear() {
      // should avoid avoid ()null pointer issue.
      for (Iterator<ISubject> it = mSubjectObserverMap.keySet().iterator(); it
            .hasNext();) {
         ISubject subject = (ISubject) it.next();
         ArrayList<IObserver> list = mSubjectObserverMap.get(subject);
         if (list == null)
            continue;
         list.clear();
      }
      mSubjectObserverMap.clear();
   }

   public synchronized void clear(Object inSubject) {
      if (mSubjectObserverMap.containsKey(inSubject)) {
         ArrayList<IObserver> list = mSubjectObserverMap.get(inSubject);
         list.clear();
         mSubjectObserverMap.remove(inSubject);
      }
   }

   public void notify(Message inMessage, int... flag) {
      // should avoid null pointer issue.
      for (Iterator<ISubject> it = mSubjectObserverMap.keySet().iterator(); it
            .hasNext();) {
         ISubject subject = (ISubject) it.next();
         notify(subject, inMessage, flag);
      }
   }

   public void notify(ISubject inSubject, Message inMessage, int... flag) {
      ArrayList<IObserver> list = mSubjectObserverMap.get(inSubject);
      if (list == null)
         return;
      for (Iterator<IObserver> it = list.iterator(); it.hasNext();) {
         IObserver observer = (IObserver) it.next();

         if (observer != null) {
            boolean asyncMode = false;
            if (flag.length > 0 && flag[0] == ISubject.FLAG_RUN_MAIN_THREAD) {
               asyncMode = true;
            }
            if (asyncMode) {
               Object[] objects = new Object[] { observer, inMessage };
               mHandler.sendMessage(mHandler.obtainMessage(0, objects));
            } else {
               observer.listen(inMessage);
            }
         }
      }
   }

   public void notify(IObserver observer, Message inMessage, int... flag) {
      boolean asyncMode = false;
      if (flag.length > 0 && flag[0] == ISubject.FLAG_RUN_MAIN_THREAD) {
         asyncMode = true;
      }
      if (asyncMode) {
         Object[] objects = new Object[] { observer, inMessage };
         mHandler.sendMessage(mHandler.obtainMessage(0, objects));
      } else {
         observer.listen(inMessage);
      }
   }
}

4、被观察者类实现被观察接口

import android.os.Message;

public abstract class BaseSubject implements ISubject {

   /*
    * (non-Javadoc)
    * 
    * @see
    * common.utils.observer.ISubject#attach(common.utils.observer.IObserver)
    */
   @Override
   public boolean addObserver(IObserver inObserver) {
      return ObserverAdapter.getInstance().register(this, inObserver);
   }

   /*
    * (non-Javadoc)
    * 
    * @see
    * common.utils.observer.ISubject#detach(common.utils.observer.IObserver)
    */
   @Override
   public boolean removeObserver(IObserver inObserver) {
      return ObserverAdapter.getInstance().unregister(this, inObserver);
   }

   /*
    * (non-Javadoc)
    * 
    * @see common.utils.observer.ISubject#notify(android.os.Message, int)
    */
   @Override
   public void notify(Message inMessage, int... flag) {
      ObserverAdapter.getInstance().notify(this, inMessage, flag);
   }

}

5、观察者类实现观察者接口

import com.hsae.d531mc.systemsetting.observer.IObserver;
public class GeneralPresenter implements IObserver { 
    @Override
    public void listen(Message inMessage) {//监听
        switch (inMessage.what) {
            case GeneralUtil.GENERAL_INIT:
               //TODO
            case GeneralUtil.LANGUAGE_SET:
                //TODO
            case GeneralUtil.STANDBY_SCREEN_SET:
                //TODO
            default:
                break;
        }
    }
}

6、调用

public class GeneralView extends BaseSubject{
    public void initData() {
        sendMessage(GeneralUtil.GENERAL_INIT, null);
    }
    private void sendMessage(int what, Object obj) {
        Message msg = Message.obtain();
        msg.what = what;
        msg.obj = obj;
        notify(msg, FLAG_RUN_SYNC);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值