朝花夕拾--觀察者模式-java筆記

先看一下類圖:



wKiom1g0DT2gbhQIAAFoaSDIwVg867.png-wh_50




具體實現:

package obs.self;

/**
 * 被觀察對象
 * @author wangfeihu
 *
 */
public interface Subject {

    /**
     * 增加一個觀察者
     * @param observer
     */
    public void addObserver(Observer observer);
    
    public void removeObserver(Observer observer);
    
    /**
     * 通知所有觀察者
     * @param msg
     */
    public void notifyObservers(Object msg);
    
}
package obs.self;

/**
 * 觀察者
 * @author wangfeihu
 *
 */
public interface Observer {

    public void update(Object msg);
}


package obs.self;

import java.util.HashSet;
import java.util.Set;

/**
 * 銀行賬戶, 餘額發生變化的時候進行相關的通知
 * @author wangfeihu
 *
 */
public class Account implements Subject {

    private int balance = 0;

    public Set<Observer> obervers = new HashSet<Observer>();

    public void addObserver(Observer observer) {
        obervers.add(observer);

    }

    public void removeObserver(Observer observer) {
        obervers.remove(observer);

    }

    public void notifyObservers(Object msg) {
        for (Observer obs : obervers) {
            obs.update(msg);
        }

    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
        this.notifyObservers("賬戶餘額發生改變," + balance);
        
    }

    /**
     * 取款
     * @param money
     */
    public void withdraw(int money) {
        this.setBalance(this.balance - money);
    }

    /**
     * 存款
     * @param money
     */
    public void deposit(int money) {
        this.setBalance(this.balance + money);
    }

}
package obs.self;

public class MobileObserver implements Observer {

    public void update(Object msg) {
        System.out.println("手機短信提醒:" + msg);
    }

}
package obs.self;

public class WechatObserver implements Observer {

    public void update(Object msg) {
        System.out.println("微信服務號提醒:" + msg);
    }

}


執行:


package obs.self;


public class ObserverTest {

    
    
    public static void main(String[] args) {
        Account accountSubject = new Account();
        
        MobileObserver mobileObserver = new MobileObserver();
        WechatObserver wechatObserver = new WechatObserver();
        
        accountSubject.addObserver(mobileObserver);
        accountSubject.addObserver(wechatObserver);
        
        // 存錢
        accountSubject.deposit(10000);
        
        // 取錢
        accountSubject.withdraw(500);
        
        //移除短信通知
        accountSubject.removeObserver(mobileObserver);
        accountSubject.withdraw(600);
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章