前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之观察者模式

设计模式之观察者模式

作者头像
再见孙悟空_
发布2023-02-10 19:35:30
2020
发布2023-02-10 19:35:30
举报

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

  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源码

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档