zoukankan      html  css  js  c++  java
  • 观察者模式

    定义

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

    结构

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

    • 被观察者:从类图中可以看到,类中有一个用来存放观察者对象的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
  • 相关阅读:
    1.4.2.3. SETUP(Core Data 应用程序实践指南)
    1.4.2.2. PATHS(Core Data 应用程序实践指南)
    1.4.2.1. FILES(Core Data 应用程序实践指南)
    1.4.2. 实现 Core Data Helper 类(Core Data 应用程序实践指南)
    1.4.1. Core Data Helper 简介(Core Data 应用程序实践指南)
    1.4. 为现有的应用程序添加 Core Data 支持(Core Data 应用程序实践指南)
    1.3.2. App Icon 和 Launch Image(Core Data 应用程序实践指南)
    1.3.1. 新建Xcode项目并设置故事板(Core Data 应用程序实践指南)
    php验证邮箱是否合法
    如何使js函数异步执行
  • 原文地址:https://www.cnblogs.com/xiaoliangup/p/9123701.html
Copyright © 2011-2022 走看看