设计模式之观察者模式

2023-02-10 19:35:30 浏览数 (1)

观察者模式是我们在开发中经常会用到的一种模式,这种模式的好处在于

  1.  1.能够在某些页面设置完了后直接通知其他监听了这个事件的页面立即刷新,而不需要用户回到某些页面的时候再刷新。
  2.  2.能够区分是哪些事件通知的,从而针对不同的事件进行不同的处理。
  3.  3.能够动态的扩展事件类型,可以让调用者很快的注册和监听事件。
  4.  其实相当于一个监听,实时的监听你想要监听的内容。举个简单的列子: A界面 跳入到B界面  在B界面做了一个操作 然后返回要刷新A界面
  5.  这个时候我们就可以用观察者的方式去实现。当然你用startactivityforresult的方式也可以,但是你还要单独去处理一些返回键可能会引起的问题等。不如这个来  的直接。

我写了一个简单的列子

Application 

代码语言:javascript复制
package com.baobao.observer;

import java.util.HashMap;
import java.util.Map;

import com.baobao.listener.ObserverModeListener;

import android.app.Application;
import android.os.Bundle;


public class AppApplication  extends Application {
	
	private static AppApplication app;
	public static final int UPDATE_VIEW = 1001;
	
	@Override
	public void onCreate() {
		super.onCreate();
		app = AppApplication.this;
	}
	
	public static AppApplication getInstance() {
		return  app;
	}
	
	// 实现整个app观察者模式 同一个action可以注册多个监听
	private Map<Integer, ObserverModeListener> observerListener = new HashMap<Integer, ObserverModeListener>();

	/**
	 * 注册监听,不需要的时候要取消监听,可在ondestory()中取消
	 * @param action
	 * @param listener
	 */
	public void registerObserver(int action, ObserverModeListener listener) {
		if (listener != null) {
			observerListener.put(action, listener);
		}
	}

	public void unRegisterObserver(int action) {
		if (observerListener.containsKey(action)) {
			observerListener.remove(action);
		}
	}

	/**
	 * 通知已经注册此action的监听去执行 ,action 必传,其他可传(null)
	 * @param action 需要传递的action要与注册的一样,
	 * @param bundle 封装对象,
	 * @param object 也可以传递自己封装的对象,
	 */
	public void updateObserver(int action, Bundle bundle, Object object) {
		if (observerListener.containsKey(action) && observerListener.get(action) != null) {
			observerListener.get(action).toUpate(bundle, object);
		}
	}
}

全局的观察者监听接口ObserverModeListener

代码语言:javascript复制
package com.baobao.listener;

import android.os.Bundle;

/**
 * 
 * @Todo 全局的观察者监听,注册在application中,不用的时候一定要解除注册
 * @author baobao
 */
public interface ObserverModeListener {
	public void toUpate(Bundle bundle, Object object);
}

主界面MainActivity 

代码语言:javascript复制
package com.baobao.observer;

import com.baobao.listener.ObserverModeListener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView name_tv;
	private TextView age_tv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findView();
		AppApplication.getInstance().registerObserver(
				AppApplication.UPDATE_VIEW, new ObserverModeListener() {
					@Override
					public void toUpate(Bundle bundle, Object object) {
						name_tv.setText("李老四");
						age_tv.setText("1000岁了,神奇吗?");
					}
				});
	}

	private void findView() {
		name_tv = (TextView) findViewById(R.id.name_tv);
		age_tv = (TextView) findViewById(R.id.age_tv);
		findViewById(R.id.confirm_btn).setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						startActivity(new Intent(MainActivity.this,TestActivity.class));
					}
				});
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		//todo 记得销毁
		AppApplication.getInstance().unRegisterObserver(AppApplication.UPDATE_VIEW);
	}

}

activity B

代码语言:javascript复制
package com.baobao.observer;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class TestActivity extends Activity{
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test);
		
		findViewById(R.id.button).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				AppApplication.getInstance().updateObserver(AppApplication.UPDATE_VIEW, null, null);
				finish();
			}
		});
	}
}

从上面这个简单的代码就可以看出一个实现的逻辑,在我们需要有更新操作界面A activity里面 注册监听,在B去做更新监听的操作,其实就是发起一个通知,去提醒对应的action 执行方法。和发广播的原理类似,达到一个通知的效果。

DEMO源码

0 人点赞