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
  • 相关阅读:
    字符串,format格式化及列表的相关进阶操作---day07
    利用wiile双层循环打印各种星星---day06
    双层循环练习,pass_break_continue,和for循环---day06
    类型判断,代码块,流程控制及循环---day05
    频繁项集算法
    Unity 物体移动的理解
    Game1---游戏设计
    精读Hadamard Response论文
    java 创建线程
    Unity游戏开发面试基础知识
  • 原文地址:https://www.cnblogs.com/xiaoliangup/p/9123701.html
Copyright © 2011-2022 走看看