在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。例如在文档/视图结构中,文档被修改了,视图就会得到通知。
2.BottomManager.java
3.MiddleManager.java
4.MainActivity.java
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());
898

被折叠的 条评论
为什么被折叠?



