Android之观察者模式

观察者模式属于行为型设计模式,

设计思想: 定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都得到通知并被自动更新

观察者模式的类图结构

在观察者模式中存在以下几个角色

1. Subject(被观察者)
目标知道它的观察者,可以有任意多个观察者观察同一个目标
提供注册和删除观察者对象的接口

2. Observer(观察者)
为那些在目标发生改变时需获得通知的对象定义个更新的接口

3. ConcreteSubject(具体被观察者)
将有关状态存入各ConcreteObserver对象
当它的状态发送改变时,向它的各个观察者发出通知

4. ConcreteObserver(具体观察者)
维护一个指向ConcreteObserver对象的引用
存储有关状态,这些状态应与目标的状态保持一致

 

下面通过一个Android例子程序来看看观察者模式的设计思想

Watched.java属于Subject(被观察者)角色

package huahua.observerpattern;

/**
 * @author huahua
 * 定义一个接口为抽象被观察者
 */
public interface Watched{  

/**
 * @param watcher
 * 定义一个用来增加观察者的方法
 */
 public void add(Watcher watcher); 

 /**
  * @param watcher
  * 定义一个用来删除观察者权利的方法
  */
 public void remove(Watcher watcher);  

 /**
  * 定义一个可以实现行为变现并向观察者传输信息的方法
  */
 public void notifyWatcher(); 

}


 Watcher.java属于Observer(观察者)角色

package huahua.observerpattern;

/**
 * @author huahua
 *	定义一个接口为抽象观察者
 */
public interface Watcher {
	/**
	 * 定义一个用来获取更新信息接收的方法
	 */
	 public void updateNotify(); 
}


 ConcreteWatched.java属于ConcreteSubject(具体被观察者)

package huahua.observerpattern;

import java.util.ArrayList;

/**
 * @author huahua
 *	具体被观察者并实现其抽象接口抽象被观察者
 */
public class ConcreteWatched implements Watched{

	//定义一个List来封装Watcher  
	private ArrayList<Watcher> list = new ArrayList<Watcher>();

	@Override
	public void add(Watcher watcher) {
		list.add(watcher);
	}

	@Override
	public void remove(Watcher watcher) {
		list.remove(watcher);
	}

	@Override
	public void notifyWatcher() {
		for(Watcher watcher : list)
		{  
		      watcher.updateNotify();
		}
	}
}


 ConcreteWatcher1.java ConcreteWatcher2.java ConcreteWatcher3.java 属于ConcreteObserver(具体观察者)角色

package huahua.observerpattern;

import android.util.Log;
import android.widget.Toast;

//定义一个类为具体观察者并实现其接口抽象观察者
public class ConcreteWatcher1 implements Watcher{

	 //覆盖其方法
	@Override
	public void updateNotify() {
		// 具体观察者在得知被观察者状态改变时进行处理
		Log.i("huahua", "观察者1接受到更新状态");
	} 
}

package huahua.observerpattern;

import android.util.Log;
import android.widget.Toast;

//定义一个类为具体观察者并实现其接口抽象观察者
public class ConcreteWatcher2 implements Watcher{

	 //覆盖其方法
	@Override
	public void updateNotify() {
		// 具体观察者在得知被观察者状态改变时进行处理
		Log.i("huahua", "观察者2接受到更新状态");
	} 
}


package huahua.observerpattern;

import android.util.Log;
import android.widget.Toast;

//定义一个类为具体观察者并实现其接口抽象观察者
public class ConcreteWatcher3 implements Watcher{

	 //覆盖其方法
	@Override
	public void updateNotify() {
		// 具体观察者在得知被观察者状态改变时进行处理
		Log.i("huahua", "观察者3接受到更新状态");
	} 
}


 MainActivity.java

package huahua.observerpattern;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//实现一个被观察者实例
		Watched watched = new ConcreteWatched();
		//实例3个观察者对被观察者进行观察
        Watcher watcher1 = new ConcreteWatcher1(); 
        Watcher watcher2 = new ConcreteWatcher2(); 
        Watcher watcher3 = new ConcreteWatcher3(); 
        //加入对其观察
        watched.add(watcher1);
        watched.add(watcher2);
        watched.add(watcher3);
        //当被观察者发生变化时调用其信息方法
        watched.notifyWatcher();
	}

}


 在主Activity中,创建3个具体的观察者实例和1个具体的被观察者实例,这3个观察者同时观察一个目标,当目标状态改变时,具体观察者会做出相应的业务处理,这个例子中打印了3个不同的Log

好了,以上就是一个完整的对观察者模式设计的核心代码体现,由上面可以知观察者与被观察者是一个多对一的关系
也就是一个被观察者可同时被多个观察者所共同进行关注当被观察者更新时同时对其观察者会自动更新其信息

 

其实观察者模式在我们平时工作中是广泛运用的模式之一,很多情况可以使用观察者模式,比如说,在程序里,可能会有通知模块,A模块的数据发生变化,B模块需要得到通知,对于这样的需要,你可能会想到用”广播”,”消息”或者”回调”的方式来解决,的确,刚才我所说的那三种也能解决,但是,这三种都是存在一些缺点,比如说广播,用Intent来传输数据很困难,对于”消息”,无法很好的跟踪,对于”回调”,有可能你A与B模块根本不可相互访问。此时,如果你会用观察者模式的问题,这种问题可以很轻松解决。

可能你已经使用过很多观察者模式,却没有意识到.像常见的ListView会绑定某个Adapter,当这个Adapter调用notifyDataSetChanged()方法时ListView就会自动刷新,这里就用了观察者模式的设计思想,有兴趣的朋友可以看看ListView和BaseAdapter源码。还有很多使用观察者模式的设计思想例子,这里就不一一列举了。

 

源码下载地址

 

 

 

 

 

 

发布了21 篇原创文章 · 获赞 8 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhangxuebing2/article/details/20626717