23模式之: 观察者模式(jdk版本)demo

具体主题类:

package observer2_mode;

import java.util.Observable;

/**
 * 具体主题类, 继承自jdk的可被观察类
 * 父类JDK已实现, 主要自带了: (1.定义: 观察者集合, 2.添加观察者, 3.移除观察者, 4.通知已注册的观察者, 5.设置变化标记)
 */
public class ConcreteSubject extends Observable{

    
    /**
     * 当作气温吧
     */
    private int state;
    
    
    /**
     * 获得气温值
     */
    public int getState() {
        return state;
    }
    
    
    /**
     * 由客户端调用, 改变气温, 并通知已注册的观察者
     */
    public void set(int state){
        this.state = state;
        setChanged();//设置变化标记, 此处不写不会通知, 底层设置true, 每次通知后, 此标记会被设为false
        notifyObservers("此处可以传任何类型的对象给观察者!");//通知已注册的观察者
    }

}

 

观察者A:

package observer2_mode;

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

/**
 * 观察者A, 实现了jdk的观察者接口
 */
public class ObserverA implements Observer{

    
    /**
     * 气温
     */
    private int myState;
    
    
    /**
     * 当接收到主题通知时, 执行的方法
     * 若主题未注册此观察者, 此方法不会被执行
     */
    @Override
    public void update(Observable o, Object arg) {
        this.myState = ((ConcreteSubject)o).getState();
        //Object arg, 可以是接收自主题对象发送的任何类型的对象!
    }

    
    /**
     * 获得气温值
     */
    public int getMyState() {
        return myState;
    }

}

 

测试类:

package observer2_mode;

public class Client {

    public static void main(String[] args) {
        //具体的主题对象
        ConcreteSubject subject = new ConcreteSubject();
        
        //模拟多个观察者
        ObserverA obs1 = new ObserverA();
        ObserverA obs2 = new ObserverA();
        ObserverA obs3 = new ObserverA();
        
        //主题对观察者进行登记注册
        subject.addObserver(obs1);
        subject.addObserver(obs2);
        subject.addObserver(obs3);
        
        //改变主题的状态
        subject.set(3000);
        System.out.println("-------------------------------状态修改了!");
        //我们看看,观察者的状态是不是也发生了变化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());
        
        //改变主题的状态
        subject.set(600);
        System.out.println("-------------------------------状态修改了!");
        //我们看看,观察者的状态是不是也发生了变化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());
    }
    
}

 

执行结果:

-------------------------------状态修改了!
3000
3000
3000
-------------------------------状态修改了!
600
600
600

 

 

谢谢声明出处!

转自: http://www.cnblogs.com/gscq073240/articles/7102697.html

 

转载于:https://www.cnblogs.com/gscq073240/articles/7102697.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值