zoukankan      html  css  js  c++  java
  • 观察者模式(Java实现)

    import java.util.ArrayList;
    import java.util.Iterator;
    
    /* 抽象观察者类 */
    
    abstract class Observer {
        
        public abstract void update();
    }
    
    /* 抽象被观察主题类 */
    
    abstract class Subject{
        
        private ArrayList obs_list = new ArrayList();
        
        public void attach(Observer obs) {
            obs_list.add(obs);
        }
        
        public void Detach(Observer obs) {
            obs_list.remove(obs);
        }
        
        public void notifyObs() {
            for (Iterator iter = obs_list.iterator(); iter.hasNext();) {
                Observer obs = (Observer) iter.next();
                obs.update();
            }
        }
    }
    
    /* 具体观察者类 */
    class ConcreteObserver extends Observer {
        
        private String obs_name;
        private ConcreteSubject cc_subj;
        
        public ConcreteObserver(String obs_name, ConcreteSubject cc_subj) {
            this.obs_name = obs_name;
            this.cc_subj = cc_subj;
        }
    
        public void update() {
            if (cc_subj.getStatus() == 1) {
                System.out.println("Boss come back, " + obs_name + " turn off screen!");
            } else {
                System.out.println("Boss go out, " + obs_name + " turn on screen!");
            }
        }
    }
    
    /* 具体观察主题类 */
    class ConcreteSubject extends Subject {
        private int status;
    
        public ConcreteSubject(int status) {
            this.status = status;
        }
        
        public int getStatus() {
            return status;
        }
    
        public void setStatus(int status) {
            
            if (status != this.status) {
                this.status = status;
                super.notifyObs();
            }
        }
        
    }
    
    public class Observer_Test{
    
        public static void main(String[] args) {
            
            ConcreteSubject cc_sub = new ConcreteSubject(0);
            
            ConcreteObserver cc_obs1 = new ConcreteObserver("E1", cc_sub);
            ConcreteObserver cc_obs2 = new ConcreteObserver("E2", cc_sub);
            ConcreteObserver cc_obs3 = new ConcreteObserver("E3", cc_sub);
            cc_sub.attach(cc_obs1);
            cc_sub.attach(cc_obs2);
            cc_sub.attach(cc_obs3);
            
            cc_sub.setStatus(1); //status changed to 1
            System.out.println("---------------------------------------");
            cc_sub.setStatus(0); //status changed to 0
    
        }
    
    }

    result:

    Boss come back, E1 turn off screen!
    Boss come back, E2 turn off screen!
    Boss come back, E3 turn off screen!
    ---------------------------------------
    Boss go out, E1 turn on screen!
    Boss go out, E2 turn on screen!
    Boss go out, E3 turn on screen!

  • 相关阅读:
    Python 列表元素排重uniq
    Python正则表达式汇总
    Python 正则表达式:只要整数和小数
    c++写入txt文件
    OpenMP求完数
    Python分割list
    用ConfigParser模块读写配置文件——Python
    Python 正则表达式
    教程和工具--用wxPython编写GUI程序的
    matlab 之字体调整
  • 原文地址:https://www.cnblogs.com/hushpa/p/4454130.html
Copyright © 2011-2022 走看看