e2

滴滴侠,fai抖

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

观察者接口:

package observer_mode;

/**
 * 观察者接口
 * 所有观察者类必须是实现了此接口的update方法, 以接收主题的通知
 */
public interface Observer {

    /**
     * 接收主题的通知时, 执行的方法
     */
    public void update(Subject subject);
    
}

 

主题基类:

package observer_mode;

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

/**
 * 主题基类
 */
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);
        }
    }
    
}

 

具体主题类:

package observer_mode;

/**
 * 具体主题类
 */
public class ConcreteSubject extends Subject{
    
    
    /**
     * 当作气温吧
     */
    private int state;

    
    /**
     * 获得气温值
     */
    public int getState() {
        return state;
    }

    
    /**
     * 由客户端调用, 改变气温, 并通知已注册的观察者
     */
    public void setState(int state) {
        this.state = state;
        //注意此处this, 不能用supper(state字段在父类不存在)
        this.notifyAllObservers();
    }
    
}

 

观察者A:

package observer_mode;

/**
 * 观察者A
 */
public class ObserverA implements Observer{

    
    /**
     * 气温
     */
    private int myState;
    
    
    /**
     * 当接收到主题通知时, 执行的方法
     * 若主题未注册此观察者, 此方法不会被执行
     */
    @Override
    public void update(Subject subject) {
        this.myState = ((ConcreteSubject)subject).getState();
    }

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

}

 

测试类:

package observer_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.registerObserver(obs1);
        subject.registerObserver(obs2);
        subject.registerObserver(obs3);
        
        //改变主题的状态
        subject.setState(3000);
        System.out.println("-----------------------状态修改了!");
        //我们看看,观察者的状态是不是也发生了变化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());
        
        //改变主题的状态
        subject.setState(30);
        System.out.println("-----------------------状态修改了!");
        //我们看看,观察者的状态是不是也发生了变化
        System.out.println(obs1.getMyState());
        System.out.println(obs2.getMyState());
        System.out.println(obs3.getMyState());
    }

}

 

执行结果:

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

 

 

谢谢声明出处!

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

 

posted on 2017-07-01 16:02  纯黑Se丶  阅读(139)  评论(0)    收藏  举报