行為型模式-觀察者模式
阿新 • • 發佈:2018-12-17
行為型模式又可以分成以下四類:第一類:通過父類與子類的關係進行實現。第二類:兩個類之間。第三類:類的狀態。第四類:通過中間類
觀察者模式屬於第二類,兩個類之間的關係
觀察者訂閱主題,當主題更新時通知觀察者
package behavior.pattern.betweenclass.observer; public interface Observer { public void update(); }
package behavior.pattern.betweenclass.observer; public class FirstKindObserver implementsObserver { 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(); } }
執行結果