码迷,mamicode.com
首页 > 编程语言 > 详细

java设计模式 GOF23 12 观察者模式

时间:2016-04-19 00:03:10      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

一.观察者模式简介

  当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

二.实际应用

  聊天室,消息订阅

  在这些应用场景下,订阅者和聊天客户端称之为观察者,需要同步到多个订阅者的数据封装到对象中,

  称之为目标。

三.模式核心

  观察者模式是一对多的通知,当一个对象发生变化时,他需要告诉每一个对象。

  通知观察者的方式:

    1)推:观察者只能被动接受消息

    2)拉:观察者可以自行决定是否接收消息。

  消息对象通过容器存放所有观察者,消息更新时通过遍历容器通知每一个观察者更新消息。  

四.简单代码实现

package com.lz.observer;

/*
 * 观察者接口
 */
public interface IObserver {
    void update(Subject sub);
}
package com.lz.observer;

public class Observer implements IObserver{

    private int thisValue;
    
    public int getThisValue() {
        return thisValue;
    }

    public void setThisValue(int thisValue) {
        this.thisValue = thisValue;
    }

    @Override
    public void update(Subject sub) {
        thisValue = ((ConcreteSubject)sub).getValue();
    }
}
package com.lz.observer;

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

public class Subject {
    /*
     * 存放观察者的容器
     */
    protected List<IObserver> list = new ArrayList<IObserver>();
    
    public void addIObserver(IObserver iobs) {
        list.add(iobs);
    }
    
    public void remove(IObserver iobs) {
        list.remove(iobs);
    }
    
    /*
     * 状态发生变化时会通知所有观察者
     */
    protected void notifyAllObserver() {
        for (IObserver iObserver : list) {
            iObserver.update(this);
        }
    }
}
package com.lz.observer;

public class ConcreteSubject extends Subject{
    private int value;

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
        notifyAllObserver();
    }

}
package com.lz.observer;

public class Client {
    public static void main(String[] args) {
        ConcreteSubject sub = new ConcreteSubject();
        /*
         * 观察者
         */
        Observer obs1 = new Observer();
        Observer obs2 = new Observer();
        Observer obs3 = new Observer();
        sub.addIObserver(obs1);
        sub.addIObserver(obs2);
        sub.addIObserver(obs3);
        sub.setValue(100);
        
        System.out.println(obs1.getThisValue());
        System.out.println(obs2.getThisValue());
        System.out.println(obs3.getThisValue());

        sub.setValue(200);
        System.out.println(obs1.getThisValue());
        System.out.println(obs2.getThisValue());
        System.out.println(obs3.getThisValue());
    }
}

 

  

  

 

java设计模式 GOF23 12 观察者模式

标签:

原文地址:http://www.cnblogs.com/larobyo/p/5406196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!