观察者模式

* 观察者模式:主要用于1:N的通知。
 * 当一个对象(目标对象)的状态变化时,需要及时告知一系列对象(观察者对象),令他们做出响应。
 * 就比如网上聊天,你发一条消息,其他人那里收到相同的消息内容。
 *方式:
 * 1.推:每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收。
 * 2.拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。

下面写的是第一种方式:

public interface Observer {
    void update(Subject subject);
}
public class Subject {
    protected List<Observer> list = new ArrayList<Observer>();

    public void registerObserver(Observer obs){
        list.add(obs);
    }

    public void removeObserver(Observer obs){
        list.remove(obs);
    }
//通知观察者更新状态
    public void notifyAllObservers(){
        for(Observer obs:list){
            obs.update(this);
        }
    }
}
/**
 * 观察者
 */
public class ObserverA implements Observer{
    private int myState;//myState需要和目标对象的state保持一致

    @Override
    public void update(Subject subject) {
        myState = ((ConcreteSubject)subject).getState();
    }

    public int getMyState() {
        return myState;
    }

    public void setMyState(int myState) {
        this.myState = myState;
    }
}
/**
 * 目标对象
 */
public class ConcreteSubject extends Subject{
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        //调用父类的notifyAllObservers方法,更新观察者状态
        this.notifyAllObservers();
    }
}

调用:

        //目标对象
        ConcreteSubject subject = new ConcreteSubject();
        //多个观察者
        ObserverA ob1 = new ObserverA();
        ObserverA ob2 = new ObserverA();
        ObserverA ob3 = new ObserverA();
        //将观察者加入到目标对象的观察队列中
        subject.registerObserver(ob1);
        subject.registerObserver(ob2);
        subject.registerObserver(ob3);
        //修改目标对象
        subject.setState(10);
        //查看观察者是否也变化
        System.out.println(ob1.getMyState());
        System.out.println(ob2.getMyState());
        System.out.println(ob3.getMyState());

结果:

10
10
10

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值