android通过观察者模式实现更新UI



观察者模式:
§定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被 自动更新

相信大家对观察者模式应该不陌生。。就不多介绍啦,上代码:
<span style="font-size:18px;">/**
 * 观察者接口
 * @author 超超boy
 *
 */
public interface Observer {
	
	void update(String str);
}</span>
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 * 被观察者的超类
 * @author 超超boy
 *
 */
public abstract class Subject {
    /**
     * 用来保存注册的观察者对象
     */
    private List<Observer> list = new ArrayList<Observer>();
    /**
     * 注册观察者对象
     * @param observer    观察者对象
     */
    public void attach(Observer observer){
        
        list.add(observer);
        System.out.println("注册一个观察者");
    }
    /**
     * 删除观察者对象
     * @param observer    观察者对象
     */
    public void detach(Observer observer){
        
        list.remove(observer);
    }
    /**
     * 通知所有注册的观察者对象
     */
    public void nodifyObservers(String newState){
        
        for(Observer observer : list){
            observer.update(newState);
        }
    }
}
/**
 * 继承被观察者
 * @author 超超boy
 *
 */
public class ConcreteSubject extends Subject {

	private static ConcreteSubject instance = null;
	private String state;
	private ConcreteSubject() {
		// TODO Auto-generated constructor stub
	}
	
    public static synchronized ConcreteSubject getInstance(){
        if(instance == null){
            instance=new ConcreteSubject();
        }
        return instance;
    }
	public void change(String newState){
        state = newState;
        System.out.println("主题状态为:" + state);
        //状态发生改变,通知各个观察者
        this.nodifyObservers(state);
    }

	public String getState() {
		return state;
	}
  
}
下面是Activity主类:布局文件很简单,就几个按钮,加上一个TextView
package com.example.observertest;

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

public class MainActivity extends Activity implements Observer{

	Button registButton,unregistButton,changeButton;
	TextView ceshiTextView;
	ConcreteSubject concreteSubject; //被观察者!
	int i=0;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	    initView();
	    initEvent();
	}


	private void initEvent() {
		registButton.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				concreteSubject.attach(MainActivity.this);
			}
		});
		unregistButton.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				concreteSubject.detach(MainActivity.this);			
			}
		});
		changeButton.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {   //这一步在实际中是放在concreteSubject类中执行的
				i++;                    //例如<span style="font-size: 11.8181819915771px; font-family: Arial, Helvetica, sans-serif;">concreteSubject类中涉及</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">sqlite数据库的数据变化就可调用。。等等</span>
				concreteSubject.change("这是测试的"+i);
				
			}
		});
	}
	private void initView() {
		registButton = (Button) findViewById(R.id.registButton);
		unregistButton = (Button) findViewById(R.id.unregistButton);
		changeButton = (Button) findViewById(R.id.changeButton);
		ceshiTextView = (TextView) findViewById(R.id.ceshiText);
		concreteSubject = ConcreteSubject.getInstance();
	}


	//借口回掉的方法
	public void update(String str) {
		// TODO Auto-generated method stub
		System.out.println(str);
		ceshiTextView.setText(str);
	}
}

此处只是简单在activity中简单的模仿了一下观察者模式怎么运行的,在 concreteSubject类中数据变化是怎么通知activity更新的
concreteSubject中通过change()方法调用Observe中的update方法。而在activity中重写了update方法,更新ui。
简单的说就是利用了接口回掉。。。



观察者模式:
§定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被 自动更新

相信大家对观察者模式应该不陌生。。就不多介绍啦,上代码:
<span style="font-size:18px;">/**
 * 观察者接口
 * @author 超超boy
 *
 */
public interface Observer {
	
	void update(String str);
}</span>
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 * 被观察者的超类
 * @author 超超boy
 *
 */
public abstract class Subject {
    /**
     * 用来保存注册的观察者对象
     */
    private List<Observer> list = new ArrayList<Observer>();
    /**
     * 注册观察者对象
     * @param observer    观察者对象
     */
    public void attach(Observer observer){
        
        list.add(observer);
        System.out.println("注册一个观察者");
    }
    /**
     * 删除观察者对象
     * @param observer    观察者对象
     */
    public void detach(Observer observer){
        
        list.remove(observer);
    }
    /**
     * 通知所有注册的观察者对象
     */
    public void nodifyObservers(String newState){
        
        for(Observer observer : list){
            observer.update(newState);
        }
    }
}
/**
 * 继承被观察者
 * @author 超超boy
 *
 */
public class ConcreteSubject extends Subject {

	private static ConcreteSubject instance = null;
	private String state;
	private ConcreteSubject() {
		// TODO Auto-generated constructor stub
	}
	
    public static synchronized ConcreteSubject getInstance(){
        if(instance == null){
            instance=new ConcreteSubject();
        }
        return instance;
    }
	public void change(String newState){
        state = newState;
        System.out.println("主题状态为:" + state);
        //状态发生改变,通知各个观察者
        this.nodifyObservers(state);
    }

	public String getState() {
		return state;
	}
  
}
下面是Activity主类:布局文件很简单,就几个按钮,加上一个TextView
package com.example.observertest;

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

public class MainActivity extends Activity implements Observer{

	Button registButton,unregistButton,changeButton;
	TextView ceshiTextView;
	ConcreteSubject concreteSubject; //被观察者!
	int i=0;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	    initView();
	    initEvent();
	}


	private void initEvent() {
		registButton.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				concreteSubject.attach(MainActivity.this);
			}
		});
		unregistButton.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				concreteSubject.detach(MainActivity.this);			
			}
		});
		changeButton.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {   //这一步在实际中是放在concreteSubject类中执行的
				i++;                    //例如<span style="font-size: 11.8181819915771px; font-family: Arial, Helvetica, sans-serif;">concreteSubject类中涉及</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">sqlite数据库的数据变化就可调用。。等等</span>
				concreteSubject.change("这是测试的"+i);
				
			}
		});
	}
	private void initView() {
		registButton = (Button) findViewById(R.id.registButton);
		unregistButton = (Button) findViewById(R.id.unregistButton);
		changeButton = (Button) findViewById(R.id.changeButton);
		ceshiTextView = (TextView) findViewById(R.id.ceshiText);
		concreteSubject = ConcreteSubject.getInstance();
	}


	//借口回掉的方法
	public void update(String str) {
		// TODO Auto-generated method stub
		System.out.println(str);
		ceshiTextView.setText(str);
	}
}

此处只是简单在activity中简单的模仿了一下观察者模式怎么运行的,在 concreteSubject类中数据变化是怎么通知activity更新的
concreteSubject中通过change()方法调用Observe中的update方法。而在activity中重写了update方法,更新ui。
简单的说就是利用了接口回掉。。。



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值