学习笔记——JAVA设计模式<21>观察者模式

观察者模式Observer


核心
–观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应
–通知观察者的方式
推:每次都会把通知以广播方式发送给所有的观察者,所有观察者只能被动接受
拉:观察者只要直到有情况即可。至于什么时候获取内容,获取什么内容都可以自主决定

代码实现

package studyGFO;

public interface Observer {
    void update(Subject subject);
}
package studyGFO;

import java.util.ArrayList;
import java.util.List;

/**
 * 主题对象
 * @author http://blog.csdn.net/thewaiting
 *
 */
public class Subject {
    protected List<Observer> list = new ArrayList<>();

    //注册观察者
    public void register(Observer observer) {
        list.add(observer);
    }
    //去除观察者
    public void remove(Observer observer) {
        list.remove(observer);
    }
    //通知所有的观察者更新状态
    public void notifyAllObserver() {
        for (Observer observer : list) {
            observer.update(this);
        }
    }
}
package studyGFO;

public class ConcreteSubject extends Subject{
    private int stste;



    public int getStste() {
        return stste;
    }

    public void setStste(int stste) {
        this.stste = stste;
        this.notifyAllObserver();
    }

}
package studyGFO;

public class ObserverA implements Observer{
    //myState的值跟目标对象state保持一致
    private int myState;
    @Override
    public void update(Subject subject) {
        myState = ((ConcreteSubject)subject).getStste();
    }
    public int getMyState() {
        return myState;
    }
    public void setMyState(int myState) {
        this.myState = myState;
    }
}
package studyGFO;

public class Client {
    public static void main(String[] args) {
        //目标对象
        ConcreteSubject subject  = new ConcreteSubject();
        //创建多个观察者
        ObserverA o1 = new ObserverA();
        ObserverA o2 = new ObserverA();
        ObserverA o3 = new ObserverA();

        //让三个观察者添加到subject对象的观察者队伍中

        subject.register(o1);
        subject.register(o2);
        subject.register(o3);

        //改变subject状态
        subject.setStste(30000);
        //观察者的状态
        System.out.println(o1.getMyState());
        System.out.println(o2.getMyState());
        System.out.println(o3.getMyState());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值