• 观察者模式


    定义

      定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新

    结构

      在最基础的观察者模式中,包括以下四个角色:

    • 被观察者:从类图中可以看到,类中有一个用来存放观察者对象的Vector容器(之所以使用Vector而不使用List,是因为多线程操作时,Vector在是安全的,而List则是不安全的),这个Vector容器是被观察者类的核心,另外还有三个方法:attach方法是向这个容器中添加观察者对象;detach方法是从容器中移除观察者对象;notify方法是依次调用观察者对象的对应方法。这个角色可以是接口,也可以是抽象类或者具体的类,因为很多情况下会与其他的模式混用,所以使用抽象类的情况比较多。
    • 观察者:观察者角色一般是一个接口,它只有一个update方法,在被观察者状态发生变化时,这个方法就会被触发调用。
    • 具体的被观察者:使用这个角色是为了便于扩展,可以在此角色中定义具体的业务逻辑。
    • 具体的观察者:观察者接口的具体实现,在这个角色中,将定义被观察者对象状态发生变化时所要处理的逻辑。

    类图

    代码实现

    观察者IObserver

    public interface IObserver {
        
        void update(Subject subject);
    
    }
    View Code

    被观察者Subject

    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class Subject {
        
        private Integer state;
        private List<IObserver> observers=new ArrayList<IObserver>();
        
        public Integer getState() {
            return state;
        }
    
        public void setState(Integer state) {
            this.state = state;
        }
    
        public List<IObserver> getObservers() {
            return observers;
        }
    
        public void setObservers(List<IObserver> observers) {
            this.observers = observers;
        }
    
        public void rigister(IObserver observer){
            observers.add(observer);
        }
        
        public void remove(IObserver observer){
            observers.remove(observer);
        }
        
         public  void notifys(){
             for(int i=0 ; i<observers.size() ;i++ ){
                 observers.get(i).update(this);
             }
         };
    
    }
    View Code

    观察者具体实现

    public class ObserverA implements IObserver{
    
        @Override
        public void update(Subject subject) {
            System.out.println(subject.getState());
        }
    
    }
    View Code

    被观察者具体实现

    public class ConcreateSubject extends Subject{
        
        public void setState (Integer state){
            super.setState(state);
            notifys();
        }
    
    }
    View Code

    测试代码

    public class Main {
        
        public static void main(String[] args) {
            ObserverA observer1=new ObserverA();
            ObserverA observer2=new ObserverA();
            ObserverA observer3=new ObserverA();
            
            ConcreateSubject subject=new ConcreateSubject();
            subject.rigister(observer1);
            subject.rigister(observer2);
            subject.rigister(observer3);
            
            subject.setState(2);
        }
    
    }
    View Code
  • 相关阅读:
    ES6语法异步转同步(小程序中测试)
    js 图片保存至手机相册
    js字符串中查看有没有在数组中的值有的话全部替换掉
    java.sql.SQLException: Access denied for user 'Administrator'@'localhost'
    <mvc:annotation-driven>新增标签
    SpingMVC之<mvc:annotation-driven/>标签
    DecimalFormat 的用法
    sui.js和workflow2.js内容详解
    mac地址和ip地址、子网掩码和默认网关
    MQTT 3 ——MQTT与Spring Mvc整合
  • 原文地址:https://www.cnblogs.com/xiaoliangup/p/9123701.html
Copyright © 2020-2023  润新知