標籤:
1.觀察者模式(Observer Mode)
定義:一種一對多的關係,屬於類與類之間的關係,不涉及繼承。
當一個對象變化時,其它依賴該對象的對象都會收到通知,並且隨著變化!
關係圖:
2.領導通知學生和老師的例子
2.1 觀察者
//觀察者介面:更新方法(更新所有的子類)public interface Observer { //更新所有的Observervoid update();}//學生類class Student implements Observer{ String name; public Student(String name) { this.name=name; }@Overridepublic void update() {// TODO Auto-generated method stubSystem.out.println(name+"收到通知。。。");}}//老師類class Teacher implements Observer{String name; public Teacher (String name) { this.name=name; }@Overridepublic void update() {// TODO Auto-generated method stubSystem.out.println(name+"收到通知。。。");}
2.2 主體:領導類
//主體:管理所有的觀察者和通知觀察者public abstract interface Subject {//添加觀察者方法void addObserver(Observer ob);//刪除觀察者方法void removeObserver(Observer ob);//通知所有的觀察者void notifyObservers();}//領導類class Leader implements Subject{ //儲存所有觀察者的池:線程同步類vectorprivate Vector<Observer> vt=new Vector<Observer>();//添加觀察者@Overridepublic void addObserver(Observer ob) {// TODO Auto-generated method stubvt.add(ob);} //刪除觀察者@Overridepublic void removeObserver(Observer ob) {// TODO Auto-generated method stubvt.remove(ob);} //通知觀察者@Overridepublic void notifyObservers() {//調用每個觀察者的更新方法Enumeration<Observer> e=vt.elements();System.out.print("領導通知所有下屬:");getCurrentDate();while(e.hasMoreElements()){Observer ob=e.nextElement();ob.update();}}//擷取當前系統時間public void getCurrentDate(){Calendar cal=Calendar.getInstance();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date=sdf.format(cal.getTime()); System.out.println(date);}}
2.3 測試
public class Test {public static void main(String[] args) {// TODO Auto-generated method stub Subject leader=new Leader(); Student stu1=new Student("張學生"); Teacher t1=new Teacher("李老師"); //添加入觀察者池 leader.addObserver(stu1); leader.addObserver(t1); //通知所有觀察者 leader.notifyObservers();}}
2.4 運行結果
領導通知所有下屬:2015-04-20 11:22:06張學生收到通知。。。李老師收到通知。。。
java-設計模式(行為型)-【觀察者模式】