安卓设计模式-观察者模式
观察者模式是什么
观察者模式又称为模型视图模式、源收听者模式、或者从属模式。在对象之间定义了一对多依赖,当一个对象(被观察者)状态改变,依赖他的对象(观察者)会收到通知并自动更新。
有什么
- 抽象被观察者角色
一个抽象的主题,他把所有的观察者对象的引用保存在一个集合中,每个主题都有任意数量的观察者,抽象主题提供一个接口,可以增加删除观察者角色 - 抽象观察者角色
为所有的具体观察者定义一个接口,在得到主题是更新自己 - 具体被观察者角色
也就是具体的一个主题,在主题内部状态改变时,所有登记者发送通知 - 具体观察者角色
实现抽象观察者角色所需的接口更新。
怎么做
观察者模式主要通过以下步骤来实现,
- 定义一个主题接口
public interface Observerable{
public void registerObserver(Observer o);
public void removeObserver(Observer 0);
public void notifyObserver();
}
- 定义一个抽象观察者接口
public interface Observer{
public void update (String msg);
}
- 定义被观察者实现observerable接口,对observerable三个接口进行具体实现,同事有一个List集合,用于保存注册的观察者,等需要通知观察者的时候,遍历该集合即可
public class MyObserservable implement Observerable{
private List<Observer> list;
private String msg;
public MyObserverable(){
list=new ArrayList<Observer>();
}
public void registerObserver(Observer o){
list.add(o);
}
public void removeObserver(Observer o){
if(!list.isEmpty()){
list.remove(o);
}
}
public void notifyObserver(){
for(int i=0;i<list.size();i++){
Observer observer=list.get(i);
observer.update(msg);
}
}
public void setInfomation(Stirng s){
this.msg=s;
notifyObserver();
}
}
4.定义具体观察者
public MyObserver implement Observer{
private msg=msg;
public void update (String msg){
this.msg=msg;
System.out.println(name + " 收到消息: " + message);
}
}
public MyObserver2 implement Observer{
private msg=msg;
public void update (String msg){
this.msg=msg;
System.out.println(name + " os2收到消息: " + message);
}
}
- 测试
public class Test{
public static void mian(String args []){
MyObserver o1=new MyObserver();
MyObserver1 o2 =new MyObserver1();
MyObserservable os=new MyObserservable();
os.regiest(o1);
os.regiest(o2);
os.setInfomation("2222");
}
}
什么时候用
1.当一个对象改变需要通知其他对象,而不需要具体有多少对象需要通知的时候
2.一个对象必须通知其他对象,而并不知道这些对象是谁。
3.一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
4.需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
优缺点
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。