23种设计模式之观察者模式

对于观察者模式,我理解的不是太好,可能跟基础薄弱有关,又或者是刚接触,做项目的时候不怎么用。

我写的这篇文章主要参考(http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html)

概念:

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变的时候,会通知所有观察者对象,使他们能够自动更新自己。它将观察者和被观察者晚买的分离了。

适用性:


 

subject(抽象主题):它把所有的观察者对象的引用保存到一个集合里面。提供一个接口,可以增加或者删除观察者

ConcreteSubject(具体主题):将有个状态存入观察者对象,在具体主题内部改变时,给相应的观察者发送通知

Observe(抽象观察者):为所有的具体观察者定义一个接口,在得到主题通知的时候更新自己

ConcreteObserver(具体观察者):实现抽象观察者所要求的更新接口,以便使状态协调


代码:

abstract class Subject {  
    private Vector<Observer> obs = new Vector<Observer>();  
      
    public void addObserver(Observer obs){  
        this.obs.add(obs);  
    }  
    public void delObserver(Observer obs){  
        this.obs.remove(obs);  
    }  
    protected void notifyObserver(){  
        for(Observer o: obs){  
            o.update();  
        }  
    }  
    public abstract void doSomething();  
}  
  
class ConcreteSubject extends Subject {  
    public void doSomething(){  
        System.out.println("被观察者事件反生");  
        this.notifyObserver();  
    }  
}  
interface Observer {  
    public void update();  
}  
class ConcreteObserver1 implements Observer {  
    public void update() {  
        System.out.println("观察者1收到信息,并进行处理。");  
    }  
}  
class ConcreteObserver2 implements Observer {  
    public void update() {  
        System.out.println("观察者2收到信息,并进行处理。");  
    }  
}  
  
public class Client {  
    public static void main(String[] args){  
        Subject sub = new ConcreteSubject();  
        sub.addObserver(new ConcreteObserver1()); //添加观察者1  
        sub.addObserver(new ConcreteObserver2()); //添加观察者2  
        sub.doSomething();  
    }  
}  

实例:

1.BaseAdapter:

观察者(DataSetObserver),目标(Observable<T>),具体目标(DataSetObserverable)
Observer(观察者),DataSetObserver抽象2个方法,一个是观察数据改变的方法,一个是观察数据变成无效(或者不可用)时的方法

BaseAdapter关联了一个DataSetObservable对象,并实现registerDataSetObserver和unregisterDataSetObserver两个方法实现注册和撤销Observer,方法notifyDataSetChanged间接调用Observer的实现者的onChange()方法,以达到通知数据改变的作用。使用ListView和BaseAdapter组合时,当BaseAdapter的item改变时,我们经常会调用notifyDataSetChanged(),通知Listview刷新

2.点击事件(OnClickListener

创建一个View.OnClickListener对象,调用Button对象的 setOnClickListener方法把该Listener对象注册给Button,当Button被点击的时候,则触发 View.OnClickListener对象的onClick方法。我们可以把这个模式理解成一个观察者模式,Button对象就是 subject,View.OnClickListener对象就是观察者,当状态更新(Button被按下去),则调用观察者(View.OnClickListener对象)的onClick方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值