java设计模式-观察者模式

大家可能都在用RxJava 或者是EventBus 吧!其实这两种工具都是运用的观察者模式,要想弄懂上面两个库,观察者模式是基础。接下来我就简单的介绍一下观察者模式。

观察者模式分为两个部分:观察者(observer)和被观察者(observable). 和我们平常使用的监听回调不同(一对一),观察者模式采用的是一对多的形式,当被观察者发生改变之后,发送消息给观察者,然后观察者做出相应的改变,这就是观察者模式。

示意图如下:


下面看一个简单的例子:

被观察者:

public class Subject {

    private List<Observer> mObservers = new ArrayList<>();

    /**
     * 绑定被观察者
     * @param observer 观察者
     */
    public void attach(Observer observer) {
        mObservers.add(observer);
    }

    /**
     * 解绑定
     * @param observer
     */
    public void deAttach(Observer observer) {
        mObservers.remove(observer);
    }

    /**
     * 发送通知
     * @param name
     */
    public void notityAll(String name) {
        for (Observer observer : mObservers) {
            observer.update(name);
        }
    }
}

很简单,为了模仿一对多的环境,我们在被观察中,定义了一个集合,这个集合存储观察者对象。notifyAll()方法模式被观察者发生改变,通知观察者。

观察者:

public class Observer {

    private Subject mSubject;

    public Observer(Subject mSubject) {
        this.mSubject = mSubject;
    }

    public void update(String name) {
        System.out.println(System.currentTimeMillis()+<span style="font-family: 'Microsoft YaHei';">"接收到了+ " + name);</span>
    }

    public void attachSubject() {
        if (mSubject != null)
            mSubject.attach(this);
    }

    public void deAttachSubject() {
        if (mSubject != null)
            mSubject.deAttach(this);
    }
}


测试代码:

public class FourActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_four);
        Subject mSubject = new Subject();
        Observer observer1 = new Observer(mSubject);
        observer.attachSubject();
        Observer observer2 = new Observer(mSubject);
        observer1.attachSubject();
        mSubject.notityAll("我是谁");
    }

}


运行结果

10-24 10:23:49.211  29086-29086/com.rxjava I/System.out﹕ 1477275829211接收到了+ 我是谁
10-24 10:23:49.211  29086-29086/com.rxjava I/System.out﹕ 1477275829211接收到了+ 我是谁

两个观察者订阅了一个被观察者,被观察者发生改变,发送信息给订阅的观察者。

JAVA中的实现类

其实在Java中有相应的类帮我们实现了设计模式,分别是Observer(观察者) 和 Observable(被观察者) .

下面看一个简单例子:

被观察者:

public class SubjectZD extends Observable {
    
    public void notity(String name) {
       <span style="color:#ff0000;"> setChanged();
        notifyObservers(name);</span>
    }
}


观察者:

public class ObserverZD implements Observer {

    public SubjectZD mSubjectZD;

    public ObserverZD(SubjectZD mSubjectZD) {
        this.mSubjectZD = mSubjectZD;
        mSubjectZD.addObserver(this);
    }

    @Override
    public void update(Observable observable, Object data) {
        if (observable instanceof SubjectZD) {
            System.out.println("observable = " + data.toString());
        }
    }
}

测试代码:

 SubjectZD subjectZD = new SubjectZD();
        ObserverZD observerZD = new ObserverZD(subjectZD);
        ObserverZD observerZD1 = new ObserverZD(subjectZD);
        subjectZD.notity("我是谁");

observer 中主要有两个方法setChanged()和notifyObservers()就可以通知到Observer了。


ok 代码到此结束


有了这个基础我们就方便了解 RxJava 和 EventBus 了,


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值