歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java設計模式-觀察者模式

Java設計模式-觀察者模式

日期:2017/3/1 9:09:16   编辑:Linux編程

觀察者模式中主要有4中角色:
1 抽象主題(Subject)角色:抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)中,每個主題都可以有任意數量的觀察者,抽象主題裡提供接口,增加和刪除觀察者,通知觀察者。
2 具體主題(ConcreteSubject)角色:將有關狀態,存入具體的觀察者對象,當自己狀態發生改變時,通知所有的觀察者
3 抽象觀察者(Observer)角色:為所有的觀察者定義一個更新接口
4 具體觀察者(ConcreteObserver)角色:實現抽象觀察者所定義的更新接口

上面這樣說太抽象,下面舉一個簡單的例子來說明:

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

/*
 * 抽象主題角色類
 */
public abstract class Subject {

    private List<Observer> list = new ArrayList<Observer>();

    public void attach(Observer observer){
        list.add(observer);
        System.out.println("Attached an Observer!");
    }

    public void detach(Observer observer){
        list.remove(observer);
    }

    public void notifyObservers(String state){
        for (Observer observer:list){
            observer.update(state);
        }
    }

}
/*
 * 具體主題角色類
 */
public class ConcreteSubject extends Subject{

    private String state;

    public String getState(){
        return state;
    }

    public void change(String newState){
        state = newState;
        System.out.println("主題狀態發生改變: " + state);
        this.notifyObservers(state);
    }
}
/*
 * 抽象觀察者角色類
 */
public interface Observer {

    public void update(String state);
}
/*
 * 具體觀察者角色類
 */
public class ConcreteObserver implements Observer{

    private String observerState;

    @Override
    public void update(String state) {
        // TODO Auto-generated method stub
        observerState = state;
        System.out.println("狀態為:"+observerState);
    }

}
public class MainClient {

    public static void main(String[] args){
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        subject.attach(observer);
        subject.change("new State");
    }
}

運行結果:

Attached an Observer!
主題狀態發生改變: new State
狀態為:new State

代碼很簡單,這裡就不多說了

觀察者模式又分推模型和拉模型
推模型:主題對象向觀察者推送主題的詳細信息,不管觀察者需不需要,很明顯,剛才的例子就是推模型
拉模型:主題對象在通知觀察者的時候,只傳遞少量信息。如果觀察者需要更具體的信息,由觀察者主動到主題對象中獲取,相當於是觀察者從主題對象中拉數據。一般這種模型的實現中,會把主題對象自身通過update()方法傳遞給觀察者,這樣在觀察者需要獲取數據的時候,就可以通過這個引用來獲取了

拉模型例子:

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

/*
 * 抽象主題角色類
 */
public abstract class Subject {

    private List<Observer> list = new ArrayList<Observer>();

    public void attach(Observer observer){
        list.add(observer);
        System.out.println("Attached an Observer!");
    }

    public void detach(Observer observer){
        list.remove(observer);
    }

    public void notifyObservers(){
        for (Observer observer:list){
            observer.update(this);
        }
    }

}
/*
 * 具體主題角色類
 */
public class ConcreteSubject extends Subject{

    private String state;

    public String getState(){
        return state;
    }

    public void change(String newState){
        state = newState;
        System.out.println("主題狀態發生改變: " + state);
        this.notifyObservers();
    }
}
/*
 * 抽象觀察者角色類
 */
public interface Observer {

    public void update(Subject subject);
}
/*
 * 具體觀察者角色類
 */
public class ConcreteObserver implements Observer{

    private String observerState;

    @Override
    public void update(Subject subject) {
        // TODO Auto-generated method stub
        observerState = ((ConcreteSubject)subject).getState();
        System.out.println("狀態為:"+observerState);
    }

}
public class MainClient {

    public static void main(String[] args){
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        subject.attach(observer);
        subject.change("new State");
    }
}

運行結果:

Attached an Observer!
主題狀態發生改變: new State
狀態為:new State

好了,設計模式-觀察者模式就總結到這裡,如有問題,歡迎指正,謝謝。

Copyright © Linux教程網 All Rights Reserved