1. 程式人生 > >行為型模式-觀察者模式

行為型模式-觀察者模式

  行為型模式又可以分成以下四類:第一類:通過父類與子類的關係進行實現。第二類:兩個類之間。第三類:類的狀態。第四類:通過中間類

  觀察者模式屬於第二類,兩個類之間的關係

  觀察者訂閱主題,當主題更新時通知觀察者

package behavior.pattern.betweenclass.observer;

public interface Observer {
    public void update();
}
package behavior.pattern.betweenclass.observer;

public class FirstKindObserver implements
Observer { private int id; public FirstKindObserver(int id) { super(); this.id = id; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass())
return false; FirstKindObserver other = (FirstKindObserver) obj; if (id != other.id) return false; return true; } @Override public void update() { System.out.println("FirstKindObserver " + id + " has received!"); } }
package behavior.pattern.betweenclass.observer;

public class SecondKindObserver implements Observer { private String id; @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; SecondKindObserver other = (SecondKindObserver) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } public SecondKindObserver(String id) { super(); this.id = id; } @Override public void update() { System.out.println("SecondKindObserver " + id + " has received!"); } }
package behavior.pattern.betweenclass.observer;

public interface Subject {
    /*增加觀察者*/  
    public void add(Observer observer);  
      
    /*刪除觀察者*/  
    public void del(Observer observer);  
      
    /*通知所有的觀察者*/  
    public void notifyObservers();  
      
    /*自身的操作*/  
    public void operation();  
}
package behavior.pattern.betweenclass.observer;

import java.util.Enumeration;
import java.util.Vector;

public abstract class AbstractSubject implements Subject{
    private Vector<Observer> vector = new Vector<Observer>();
    
    @Override  
    public void add(Observer observer) {  
        vector.add(observer);  
    }  
  
    @Override  
    public void del(Observer observer) {  
        vector.remove(observer);  
    }  
  
    @Override  
    public void notifyObservers() {  
        Enumeration<Observer> enumo = vector.elements();
        while(enumo.hasMoreElements()){
            enumo.nextElement().update();
        }  
    }  
}
package behavior.pattern.betweenclass.observer;

public class MySubject extends AbstractSubject {

    @Override
    public void operation() {
        System.out.println("update self!");  
        notifyObservers();
    }

}

  測試程式碼

package behavior.pattern.betweenclass.observer;

public class Client {
    public static void main(String[] args) {
        Subject sub = new MySubject();  
        sub.add(new FirstKindObserver(123));  
        sub.add(new SecondKindObserver("111"));
        sub.add(new FirstKindObserver(456));
        sub.add(new SecondKindObserver("222"));
          
        sub.operation();  
        
        sub.del(new SecondKindObserver("222"));
        
        sub.operation();
    }
}

  執行結果