andriod observer模式

在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。例如在文档/视图结构中,文档被修改了,视图就会得到通知。 

      java.util.Observable中有两个方法对Observer特别重要,一个是setChange()方法用来设置一个内部标志位注明数据发生了变化;一个是notifyObservers()方法会去调用一个列表中所有的Observer的update()方法,通知它们数据发生了变化。 


      Observer通过Observable的addObserver()方法把自己添加到这个列表中。这个列表虽然由Observable拥有,但Observable并不知道到底有哪些Observer正在观察等待通知。Observable只提供一个方法让Observer能把自己添加进列表,并保证会去通知Observer发生了变化。通过这种机制,可以有任意多个Observer对Observable进行观察,而不影响Observable的实现。


一个简单例子(页面切换时 修改 头尾部分)

1.TitleManager.java

package com.example.view.manager;

 

import java.util.Observable;
import java.util.Observer;
import org.apache.commons.lang3.StringUtils;
import com.example.myandriod3.ConstantValue;
import com.example.myandriod3.R;
import com.example.views.SecondUi;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class TitleManager implements Observer 
{
 
	private RelativeLayout commonContainer;
	private RelativeLayout loginContainer;
	private RelativeLayout unLoginContainer;
	
	private ImageView goback;//  
	private ImageView help;//  
	private ImageView login;//  

	private TextView titleContent;// 
	private TextView userInfo;//
	
	
	/**
	 * 单例模式 
	 */
	private static TitleManager instance = new TitleManager();

	private TitleManager() {
	}

	public static TitleManager getInstance() {
		return instance;
	}
	
	/**
	 * 初始化
	 * @param activity
	 */
	public void init(Activity activity){
		
		commonContainer = (RelativeLayout) activity
				.findViewById(R.id.ii_common_container);
		unLoginContainer = (RelativeLayout) activity
				.findViewById(R.id.ii_unlogin_title);
		loginContainer = (RelativeLayout) activity
				.findViewById(R.id.ii_login_title);

		goback = (ImageView) activity.findViewById(R.id.ii_title_goback);
		help = (ImageView) activity.findViewById(R.id.ii_title_help);
		login = (ImageView) activity.findViewById(R.id.ii_title_login);

		titleContent = (TextView) activity.findViewById(R.id.ii_title_content);
		userInfo = (TextView) activity.findViewById(R.id.ii_top_user_info);
		
		setListener();
		
	}
	
	private void setListener() {
		goback.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				System.out.println("goback");
 
			}
		});
		help.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				System.out.println("help");

			}
		});
		/**
		 * 登陆页面
		 */
		login.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//MiddleManager.getInstance().ChangeUi(new SecondUi(MiddleManager.getInstance().getContext()));
				MiddleManager.getInstance().ChangeUi2(SecondUi.class);
				
				//System.out.println("login");
 
			}
		});

	}
	
	public void initTitle(){
		commonContainer.setVisibility(View.GONE);
		loginContainer.setVisibility(View.GONE);
		unLoginContainer.setVisibility(View.GONE);
	}
	
	public void showCommonTitle() {
		initTitle();
		commonContainer.setVisibility(View.VISIBLE);
	}

	public void showUnLoginTitle() {
		initTitle();
		unLoginContainer.setVisibility(View.VISIBLE);
	}

	public void showLoginTitle() {
		initTitle();
		loginContainer.setVisibility(View.VISIBLE);
	}
	
	public void changeTitle(String title) {
		titleContent.setText(title);
	}

	
	//观察者模式 中  update 操作 修改 头部操作
	@Override
	public void update(Observable observable, Object data)
	{
		// TODO Auto-generated method stub
		if (data != null && StringUtils.isNumeric(data.toString())) {
			int id = Integer.parseInt(data.toString());
			switch (id) {
			case ConstantValue.VIEW_FIRST:
				showUnLoginTitle();
				
				break;
			case ConstantValue.VIEW_SECOND:
				showCommonTitle();
				break; 
			}
		}
	}
	
	
 
}

2.BottomManager.java

package com.example.view.manager;
 

import java.util.Observable;
import java.util.Observer;

import org.apache.commons.lang3.StringUtils;

import com.example.myandriod3.ConstantValue;
import com.example.myandriod3.R;
 
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class BottomManager implements Observer 
{
 
	private static BottomManager instrance;
 
	private BottomManager() {
	}
 
	public static BottomManager getInstrance() {
		if (instrance == null) {
			instrance = new BottomManager();
		}
		return instrance;
	}
	
	protected static final String TAG = "BottomManager";

	private RelativeLayout bottomMenuContainer;
	 
	private LinearLayout commonBottom; 
	private LinearLayout playBottom; 

 
	private ImageButton cleanButton;
	private ImageButton addButton;

	private TextView playBottomNotice;
 
	private ImageButton homeButton;
	private ImageButton hallButton;
	private ImageButton rechargeButton;
	private ImageButton myselfButton;
	
	
	public void init(Activity activity) {
		bottomMenuContainer = (RelativeLayout) activity.findViewById(R.id.ii_bottom);
		commonBottom = (LinearLayout) activity.findViewById(R.id.ii_bottom_common);
		playBottom = (LinearLayout) activity.findViewById(R.id.ii_bottom_game);

		playBottomNotice = (TextView) activity.findViewById(R.id.ii_bottom_game_choose_notice);
		cleanButton = (ImageButton) activity.findViewById(R.id.ii_bottom_game_choose_clean);
		addButton = (ImageButton) activity.findViewById(R.id.ii_bottom_game_choose_ok);

	 
		setListener();
	}
	
	
	private void setListener() {
		 
		cleanButton.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Log.i(TAG, "1");

			}
		});
	 
		addButton.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Log.i(TAG, "2");

			}
		});
	}
 
	public void showCommonBottom() {
		if (bottomMenuContainer.getVisibility() == View.GONE || bottomMenuContainer.getVisibility() == View.INVISIBLE) {
			bottomMenuContainer.setVisibility(View.VISIBLE);
		}
		commonBottom.setVisibility(View.VISIBLE);
		playBottom.setVisibility(View.INVISIBLE);
	}
	
	
	public void showGameBottom() {
		if (bottomMenuContainer.getVisibility() == View.GONE || bottomMenuContainer.getVisibility() == View.INVISIBLE) {
			bottomMenuContainer.setVisibility(View.VISIBLE);
		}
		commonBottom.setVisibility(View.INVISIBLE);
		playBottom.setVisibility(View.VISIBLE);
	}
	
	
	public void changeBottomVisiblity(int type) {
		if (bottomMenuContainer.getVisibility() != type)
			bottomMenuContainer.setVisibility(type);
	}
	
	
	public void changeGameBottomNotice(String notice) {
		playBottomNotice.setText(notice);
	}

	@Override
	public void update(Observable observable, Object data)
	{
		// TODO Auto-generated method stub
		if (data != null && StringUtils.isNumeric(data.toString())) {
			int id = Integer.parseInt(data.toString());
			switch (id) {
			case ConstantValue.VIEW_FIRST:
				showCommonBottom();
				break;
			case ConstantValue.VIEW_SECOND:
				showGameBottom();
				break;
		 
			}
		}
	}
	
}

3.MiddleManager.java 

package com.example.view.manager;

import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Observable;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.RelativeLayout;

import com.example.myandriod3.ConstantValue;
import com.example.myandriod3.R;
 
//Observable 成为观察者
public class MiddleManager extends Observable
{
 
	private RelativeLayout middle;
	
	private BaicUi curridBaicUi;
	//存放实例化的对象
	private Map<String, BaicUi> VIEWCACHE = new HashMap<String, BaicUi>();
	//历史记录
	public LinkedList<String> HISTORY = new LinkedList<String>();
 
	public void setMiddle(RelativeLayout middle) {
		this.middle = middle;
	}
 
	/**
	 * 单例模式 
	 */
	private static MiddleManager instance = new MiddleManager();

	private MiddleManager() {
	}

	public static MiddleManager getInstance() {
		return instance;
	}
	
	/**
	 * 初始化 如果存在 就不存放
	 * @param activity
	 */
	
   public void ChangeUi2(Class<? extends BaicUi> targetClazz){
 
	   if(curridBaicUi!=null && curridBaicUi.getClass() == targetClazz){
		   return;
	   }

	    BaicUi targetui =null;
		String key=targetClazz.getSimpleName();
		if(VIEWCACHE.containsValue(key)){
			targetui=VIEWCACHE.get(key);
		}else{

			try
			{
				Constructor<? extends BaicUi> constructor = targetClazz.getConstructor(Context.class);
				targetui = constructor.newInstance(getContext());
				VIEWCACHE.put(key, targetui);
			} catch (Exception e)
			{
				throw new RuntimeException("constructor new instance error");
			}
		}
		
		middle.removeAllViews();
		View child=targetui.getChild();
		middle.addView(child);
		child.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.ia_view_change));
		curridBaicUi = targetui; 
		
		//System.out.println(key);
	 
		HISTORY.addFirst(key);
		changeTitleAndBottom();
   }
	
	public void ChangeUi(BaicUi ui){
		middle.removeAllViews();
		View child=ui.getChild();
		middle.addView(child);
		child.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.ia_view_change));
 
	}
	
	
	private void changeTitleAndBottom() {

//		  switch (curridBaicUi.getID()) { 
//		  case ConstantValue.VIEW_FIRST:
//			  TitleManager.getInstance().showUnLoginTitle();
//			  BottomManager.getInstrance().showCommonBottom(); 
//			 break;
//			 case ConstantValue.VIEW_SECOND:
//				 TitleManager.getInstance().showCommonTitle();
//				 BottomManager.getInstrance().showGameBottom(); 
//				 break;
//			 }
		
			setChanged();
			notifyObservers(curridBaicUi.getID());
		 
	}
	
	
	/**
	 *获取上下文
	 * @return
	 */
	public Context getContext() {
		return middle.getContext();
	}
	
	/**
	 * 返回键操作
	 * 
	 */
	
	public boolean goBack() {
 
		if (HISTORY.size() > 0) {
			// Throws:NoSuchElementException - if this LinkedList is empty.
			HISTORY.removeFirst();

			if (HISTORY.size() > 0) {
				// Throws:NoSuchElementException - if this LinkedList is empty.
				String key = HISTORY.getFirst();
				BaicUi targetUI = VIEWCACHE.get(key);

				middle.removeAllViews();
				middle.addView(targetUI.getChild());
				curridBaicUi = targetUI;
				changeTitleAndBottom();
				
				return true;
				
			}
		}

		return false;
	}
	
}

4.MainActivity.java

//建立观察者 和被观察者之间的关系
		MiddleManager.getInstance().addObserver(TitleManager.getInstance());
		MiddleManager.getInstance().addObserver(BottomManager.getInstrance());


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值