设计模式之观察者模式

举报
再见孙悟空_ 发表于 2022/01/13 23:59:42 2022/01/13
【摘要】 观察者模式是我们在开发中经常会用到的一种模式,这种模式的好处在于  1.能够在某些页面设置完了后直接通知其他监听了这个事件的页面立即刷新,而不需要用户回到某些页面的时候再刷新。 2.能够区分是哪些事件通知的,从而针对不同的事件进行不同的处理。 3.能够动态的扩展事件类型,可以让调用者很快的注册和监听事件。...

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

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

       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

        package com.baobao.listener;
        import android.os.Bundle;
        /**
         *
         * @Todo 全局的观察者监听,注册在application中,不用的时候一定要解除注册
         * @author baobao
         */
        public interface ObserverModeListener {
       	public void toUpate(Bundle bundle, Object object);
        }
    
   
主界面MainActivity 

        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

        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 执行方法。和发广播的原理类似,达到一个通知的效果。
如果大家还有其它问题,可以加入我的qq群 Android开发经验交流群 454430053 讨论交流。

文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/54019131

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。