观察者模式

1代码Subject


package packagedemo;

import java.util.ArrayList;
import java.util.List;

public class Subject {

      private List<Observer1> observers 
      = new ArrayList<Observer1>();
      
   private int state;
 
   public int getState() {
      return state;
   }
 
   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }
   
   
   public void attach(Observer1 observer1){//1
      observers.add((Observer1) observer1);      
   }

   public void detach(Observer1 observer1){//1
          observers.remove((Observer1) observer1);      
       }
    public void notifyAllObservers(){
          for (Observer1 observer11 : observers) {
            /* if(observer1 instanceof FirstObserver )
             ((FirstObserver)observer1).update();
             else if(observer1 instanceof SecondObserver)
             {
                 ((SecondObserver)observer1).update();
             }
             else{
                 
             }*/
              ((Observer1)observer11).update();
              
          }
       }  
   
   
}//public class

 

 

2代码Observer1

package packagedemo;



public abstract  class Observer1  {
 
        public abstract void update();
        protected Subject subject;
        protected int observerstate;//protected
        public int getObserverstate() {
            return observerstate;
        }
        public void setObserverstate(int observerstate) {
            this.observerstate = observerstate;
        }
        
     
        
}

 

 

3代码第一个子类

package packagedemo;


public class FirstObserver extends Observer1{

    
    private int $tq;
    private int _int1;//以字母、下划线、或者$开头
    /**
     * 
     * 
     * 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
                         首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
     * @param subject
     */
    
     public FirstObserver(Subject subject){
          this.subject = subject;
          this.subject.attach((Observer1) this);
           
          double num =   (int)(Math.random()*100+1);
          this.observerstate = (int)num; //继承来的变量,受保护的变量
       }
     
       @Override
       public void update() {
          System.out.println( "FirstObserver的原始状态是:"+this.getObserverstate()+",收到的状态是: " 
          +  subject.getState());   
          this.observerstate = subject.getState();
       }

 
     
       
}

 

 

 

4代码第二个子类

package packagedemo;


public class SecondObserver extends Observer1{

     public SecondObserver(Subject subject){
          this.subject = subject;
          this.subject.attach((Observer1) this);
          
          double num = (int)(Math.random()*100+1);
          this.observerstate = (int)num; //继承来的变量,受保护的变量
       }
     
       @Override
       public void update() {
          System.out.println( "SecondObserver的原始状态是:"+this.getObserverstate()+",和接收到的状态是: " 
          +  subject.getState());   //Integer.toBinaryString( subject.getState() ) ); 
          this.observerstate = subject.getState();
       }
 
}//public class SecondObserver 

/**
/*  //创建Random类对象
Random random = new Random();               
//产生随机数
int number = random.nextInt(100 - 50 + 1) + 50;//50,100+1
*/

 

 

5代码

【测试类】
package packagedemo;

public class Test1 {
    public static void main(String[] args) {
          Subject subject = new Subject();
          
          new FirstObserver(subject);
         
          new SecondObserver(subject);
          
          System.out.println("第一次把subject。state改变为: 111");   
          subject.setState(111);
          System.out.println("------------------------分割线--------------------------");
          System.out.println("第二次把subject。state改变为: 222");  
          subject.setState(222);
        
       }
}

6、输出结果

第一次把subject。state改变为: 111
FirstObserver的原始状态是:90,收到的状态是: 111
SecondObserver的原始状态是:11,和接收到的状态是: 111
------------------------分割线--------------------------
第二次把subject。state改变为: 222
FirstObserver的原始状态是:111,收到的状态是: 222
SecondObserver的原始状态是:111,和接收到的状态是: 222

 

posted @ 2019-10-15 17:05  guofen3399  阅读(97)  评论(0)    收藏  举报