【设计模式五之观察者模式】java中的观察者模式在android主题切换或者数据刷新时的应用

前段时间稍微优化了android相关主题部分的一些代码,因为之前有这样的一个bug,有时候停留在一个界面的时候,偶尔会有界面中的listview的adapter的刷新。当时考虑了,用广播实在是太low了吧,要发或者注册那么多广播肯定是不现实的,后来考虑了下。,观察者模式应该算是最好的

第一:需求是这样的,如果检测到有主题更新的时候,默认是会下载这个主题并且应用的,所以也就有了观察的触发点,也就是应用主题
第二:观察的对象,每一个需要刷新主题的界面其实都是有一个被观察的对象
第三:我们要构建一个主题的观察者类,也就是作为我们的触发点,将所有的需要观察的对象全部都扔进去进行观察
第四:当主题在更新的时候,及时去通知所有的被观察的对象。从而改变其状态;

下面是实例代码部分:

构建一个我们观察者类的抽象接口IWatcher

package com.zzf.demo.observer;
public interface IWatcher {
	public void registerObserver(Observer observer);
	public void unregisterObserver(Observer observer);
	public void notifyAllObserver();
}

构建我们观察者的具体的实体类:ThemeWatcher

package com.zzf.demo.observer;

import java.util.Vector;

public class ThemeWatcher implements IWatcher{
	
	Vector<Observer> veObservers;
	
	public ThemeWatcher(){
		veObservers = new Vector<>();
	}
	
	public void registerObserver(Observer observer) {
		if(null  != veObservers){
			veObservers.add(observer);
		}
	}
	
	public void unregisterObserver(Observer observer) {
		if(null != veObservers){
			if(veObservers.contains(observer)){
				veObservers.remove(observer);
			}
		}
	}
	
	public void notifyAllObserver(){
		if(null != veObservers && veObservers.size() !=  0){
			for(int i = 0; i<veObservers.size() ;i++){
				Observer  observer = veObservers.get(i);
				observer.updateUi();
			}
		}
	}	
}

被观察的对象的抽象类Observer

package com.zzf.demo.observer;

public interface Observer {
		public void updateUi();
}

要观察的对象的实体类UiThemeObserver1

package com.zzf.demo.observer;

public class UiThemeObserver1 implements Observer{
	
	
	@Override
	public void updateUi() {
		// TODO Auto-generated method stub
		System.out.println("刷新UI1的数据");
	}

}

要观察的对象的实体类UiThemeObserver1

package com.zzf.demo.observer;

public class UiThemeObserver2 implements Observer{

	@Override
	public void updateUi() {
		// TODO Auto-generated method stub
		System.out.println("刷新界面2的数据");
	}

}

测试类:TestMain

package com.zzf.demo.observer;

public class TestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ThemeWatcher themeWatcher = new ThemeWatcher();
		
		UiThemeObserver1 uiThemeObserver1 = new UiThemeObserver1();
		UiThemeObserver2 uiThemeObserver2 = new UiThemeObserver2();
		
		themeWatcher.registerObserver(uiThemeObserver1);
		themeWatcher.registerObserver(uiThemeObserver2);
		
		//触发点
		themeWatcher.notifyAllObserver();
		
		//
		themeWatcher.unregisterObserver(uiThemeObserver2);
		themeWatcher.unregisterObserver(uiThemeObserver1);
		
	}
}

当主题在更新的时候,会去通知已经注册的相关界面的观察者,去更新掉那些界面重点一些数据,当然那个还是需要在本demo基础上再进行一些优化的。比如传给每个观察者的都是一个顶层的接口啥的,然后就可以统一去更新,增加一个

 //伪代码部分
 interface ObserverDisplay{
	 void display();
}
伪代码部分
class Activity implements ObserverDisplay{
	
	onCreate(){
		Uitheme uitheme = new Uitheme(this);
	}
	//重写方法
	void display(){
	
	}
}

class Uitheme implements Observer{
	ObserverDisplay display;
	public Uitheme(ObserverDisplay display){
		this.display = display;
	}
	
	@Override
	public void updateUi() {
	// TODO Auto-generated method stub
	System.out.println("刷新界面2的数据");
	}	
}
从上面我们可以看出,这样就没有必要通过每一个观察的对象都去重新去写一个具体的实体类,而通过一个实体类,就可以观察所有具有相似特征的 一类对象;进而更加的简化了我们的代码

在最后谢谢 大家的观看,写的不好的,或者错误的,请各位看官不腻赐教,不懂的地方,也可以相互交流,这也是在记录自己的成长过程的一种方式,谢谢,欢迎持续访问博客:会有更多精彩的

欢迎继续访问,我的博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值