• 观察者模式


    观察者模式的组成

      抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

      抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

      具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

      具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

    • java.util.EventListener
    • javax.servlet.http.HttpSessionBindingListener
    • javax.servlet.http.HttpSessionAttributeListener 
    • Web开发中监听Session事件采用的是观察者模式
    • JDK 提供了  java.util.Observable,  java.util.Observer类

    如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口。

    import java.util.* ; 
    class House extends Observable{ // 表示房子可以被观察 
        private float price ;// 价钱 
        public House(float price){ 
            this.price = price ; 
        } 
        public float getPrice(){ 
            return this.price ; 
        } 
        public void setPrice(float price){ 
            // 每一次修改的时候都应该引起观察者的注意 
            super.setChanged() ;    // 设置变化点 
            super.notifyObservers(price) ;// 价格被改变 
            this.price = price ; 
        } 
        public String toString(){ 
            return "房子价格为:" + this.price ; 
        } 
    };  
    class HousePriceObserver implements Observer{ 
        private String name ; 
        public HousePriceObserver(String name){ // 设置每一个购房者的名字 
            this.name = name ; 
        } 
        public void update(Observable o,Object arg){ 
            if(arg instanceof Float){ 
                System.out.print(this.name + "观察到价格更改为:") ; 
                System.out.println(((Float)arg).floatValue()) ; 
            } 
        } 
    }; 
    public class ObserDemo01{ 
        public static void main(String args[]){ 
            House h = new House(1000000) ; 
            HousePriceObserver hpo1 = new HousePriceObserver("购房者A") ; 
            HousePriceObserver hpo2 = new HousePriceObserver("购房者B") ; 
            HousePriceObserver hpo3 = new HousePriceObserver("购房者C") ; 
            h.addObserver(hpo1) ; 
            h.addObserver(hpo2) ; 
            h.addObserver(hpo3) ; 
            System.out.println(h) ; // 输出房子价格 
            h.setPrice(666666) ;    // 修改房子价格 
            System.out.println(h) ; // 输出房子价格 
        } 
    };

    运行结果:

    房子价格为:1000000.0

    购房者C观察到价格更改为:666666.0

    购房者B观察到价格更改为:666666.0

    购房者A观察到价格更改为:666666.0

    房子价格为:666666.0

  • 相关阅读:
    Vmware安装CentOS6
    MySQL Explain详解
    数据库——Redis超详细总结
    读书——你的见识决定你的人生
    软件——Ubuntu16.04设置静态ip地址
    软件——Hexo-NexT配置个人博客
    Java——Java实现生产者消费者
    程序员的踩坑经验总结(四):死锁
    程序员的踩坑经验总结(三):内存泄露
    认识自己和世界
  • 原文地址:https://www.cnblogs.com/zjm-1/p/9059708.html
Copyright © 2020-2023  润新知