设计模式:观察者模式(发布订阅模式)

本文介绍了观察者模式的基本概念,包括观察者(订阅者)和被观察者(发布者)两种主要角色。阐述了如何通过Java的Observable和Observer接口实现观察者模式,并提供了具体的代码实例,展示了如何在状态变化时通知所有观察者。

package pattern.observer;

/**
    介绍:两种主要角色 :观察者(订阅者),被观察者(发布者)
    当被观察者的状态发生改变时,可以及时通知观察者(观察者可以及时知道被观察者状态的改变)。
    观察者可以有多个,要可以扩展(另外的观察者加入时方便)
    好处:两种角色解耦,业务逻辑分离,每个角色只做自己该做的事儿。
               添加或删除观察者也变得很容易。
    Java观察者模式 (Observable,Observer)
    被观察者 继承Observable,观察者 实现Observer
    Observable中的两个变量,changed用来记录此对象是否发生改变,obs用来存放观察者对象,Vector可以使线程安全
        private boolean changed = false;
        private Vector obs;
        void deleteObserver(Observer o);
        void deleteObservers() ;    //删除所有观察者    
        void setChanged(); //将changed状态置为 true;
        void clearChanged(); //将changed状态置为 false;
        void addObserver(Observer o);
        boolean hasChanged(); //查看是否发生状态改变
        int countObservers(); //查看观察者数目

        /**
        * 判断是否发生改变,如果发生改变,先修改状态,再通知其他观察者。
        * 加锁的区域尽量小,只在需要加锁的地方加锁,不需要加锁的代码,可以拿出来
        */
        notifyObservers(Object arg){
            Object[] arrLocal;
            synchronized (this) {
                if (!changed)
                    return;
                arrLocal = obs.toArray();
                clearChanged();
            }
            for (int i = arrLocal.length-1; i>=0; i--)
                ((Observer)arrLocal[i]).update(this, arg);
        }

    实现Observer,需要实现void update(Observable o, Object arg); 这个方法是被观察者状态改变以后,通知观察者,观察者所做的动作

    
*/

import java.util.Observable;

/**
 * @Author : haojiangt
 * @Description : 观察者模式(发布订阅模式)
 **/
public class Item extends Observable {
    private String person;
    public void get(){
        System.out.println("wait a moment!");
        //当person为girl时,状态发生改变,判断状态发生改变,通知观察者们,同时将观察到的事物告诉观察者们。
        Long gender =System.currentTimeMillis()%2;
        if(gender == 1){
            person = "boy";
            System.out.println("A "+ person + " coming");
        }else{
            person = "girl";
            System.out.println("A "+ person + " coming");
            setChanged();
        }
        System.out.println("There are "+this.countObservers()+" person(s)");
        if(this.hasChanged()) {
            notifyObservers(person);
        }
    }
}

package pattern.observer;

import java.util.Observable;
import java.util.Observer;

/**
 * @Author : haojiangt
 * @Description :
 **/
public class ObserverTest implements Observer{
    //重写update方法
    @Override
    public void update(Observable o, Object arg) {
        String gender = (String) arg;
        System.out.println("I watched a "+gender);
    }

    public static void main(String[] args){
        Item item = new Item();
        for(int i = 0; i < 5; i++){
            ObserverTest observerTest = new ObserverTest();
            item.addObserver(observerTest);
        }
        item.get();
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值