• 观察者模式


    日常生活中,当我们订阅了报纸后,每天早上报社都会把报纸送到家门口;取消订阅后,报社将不再给我们提供送报纸的服务了;我们把这样的场景可以理解为观察者模式:

    1. 观察者(Obersver),享受服务者,它可以订阅多个服务(主题);当主题发生变化时,会自动给观察者发送消息;

    2. 主题(Subject),服务提供者,可以为多个观察者提供服务;接受观察者的订阅与取消订阅操作;并同时为订阅者提供服务;

    优点:

    主题与观察者之间高度解耦,是多对多的关系;增加主题或是观察者都对已有的代码没有影响。

    观察者订阅主题的方式:

    observer.register(subject);

    观察者删除主题的方式:

    observer.remove(subject);

    参考代码(JAVA版)

    public interface Observer {
        public void update(float temp, float humidity, float pressure);
        
        public void register(Subject sub);
        
        public void remove(Subject sub);
    }
    public interface Subject {
        public void registerObserver(Observer o);
        public void removeObserver(Observer o);
        public void notifyObserver();
        public void updateData(float temp, float huidity, float pressure);
    }    
    public class WeatherObserver implements Observer{
        
        private float temp;
        private float humidity;
        private float pressure;
        
        
        @Override
        public void update(float temp, float humidity, float pressure) {
            this.temp = temp;
            this.humidity = humidity;
            this.pressure = pressure;
            
            System.out.println(this.toString());
        }
    
        public WeatherObserver(){
        }
    
        
        @Override
        public String toString() {
            return "WeatherObserver [temp=" + temp + ", humidity=" + humidity + ", pressure=" + pressure + "]";
        }
    
        @Override
        public void register(Subject sub) {
            sub.registerObserver(this);
        }
    
        @Override
        public void remove(Subject sub) {
            sub.removeObserver(this);
        }
        
        
    }
    import java.util.LinkedList;
    import java.util.List;
    
    public class WeatherSubject implements Subject {
    
        private List<Observer> observerList;
        private float temp;
        private float humidity;
        private float pressure;
        
        public WeatherSubject(){
            this.observerList = new LinkedList<Observer>();
        }
        @Override
        public void registerObserver(Observer o) {
            observerList.add(o);
            
        }
    
        @Override
        public void removeObserver(Observer o) {
            if( observerList.contains(o)){
                observerList.remove(o);
            }
            
        }
    
        @Override
        public void notifyObserver() {
            int size = observerList.size();
            for(int i = 0; i < size; i++){
                observerList.get(i).update(temp, humidity, pressure);
            }
            
        }
    
        public void updateData(float temp, float huidity, float pressure){
            this.temp = temp;
            this.humidity = huidity;
            this.pressure = pressure;
        }
    }
    public class Main {
    
        public static void main(String[] args) {
    
            Subject weatherSubject = new WeatherSubject();
            
            Observer weatherObs = new WeatherObserver();
    
            weatherObs.register(weatherSubject);
            
            weatherSubject.updateData(10, 20, 30);
            weatherSubject.notifyObserver();
            
            weatherObs.remove(weatherSubject);
            weatherSubject.updateData(10, 20, 30);
            weatherSubject.notifyObserver();
            
            weatherSubject.updateData(10, 20, 30);
            weatherSubject.notifyObserver();
        }
    
    }
  • 相关阅读:
    记录操作日志
    sql优化【转】
    JS事件
    MFC电子词典
    控制台电子词典---链表
    控制台电子词典
    贪吃蛇
    十六进制转化
    进程线程
    面试体复习
  • 原文地址:https://www.cnblogs.com/ordili/p/6531929.html
Copyright © 2020-2023  润新知