1.17(設計模式)觀察者模式

觀察者模式定義了對象間一對多的關係,當一個對象狀態發生變化時,全部依賴於該對象的對象也將發生變化。html

 

例如須要顯示一個數字(Subject)的十進制(Observer )和二進制(Observer ),當這個數發生變化時,對應顯示的十進制和二進制數也要發生變化。java

這就可使用觀察者模式,顯示十進制數和二進制數依賴於具體的數字,當具體數字發生變化時,依賴對象也發生變化。ide

 

 

Subjectthis

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

public class Subject {
    private List<Observer> observers = new ArrayList<Observer>();
    
    private int state;//具體的數字 public int getState() {
        return state;
    }
    
    
    public void setState(int state) {
        this.state = state;
        notifyAllObserver();//更新具體數字時同時通知Observer更新狀態
    }
    
    public void attach(Observer observer) {//添加依賴對象(2、十進制顯示) this.observers.add(observer);
    }
    
    public void notifyAllObserver() {//通知全部Observer更新 for(Observer observer : observers) {
            observer.update();
        }
    }
}

 

 

Observerspa

Observer是依賴於Subject的對象,當Subject發生變化時,依賴的Observer也發生變化。code

public abstract class Observer {
    protected Subject subject;//Observer依賴的對象 public abstract void update();//Observer更新
}

 

二進制顯示(Observer)server

public class BinaryObserver extends Observer{
    
    public BinaryObserver(Subject subject) {//綁定subject,當subject發生變化時,該對象也發生變化。 this.subject = subject;
        this.subject.attach(this);//將當前對象(Observer)添加到subject中的observers 
 } 

@Override
public void update() { //subject發生變化,調用notifyAllObsever時更新顯示數據
  System.out.println(
"BinaryObserver:" + Integer.toBinaryString(subject.getState()));
  }
}

 

十進制顯示(Observer)htm

public class OctalObserver extends Observer{
    
    
    
    public OctalObserver(Subject subject) {//綁定subject,當subject發生變化時,該對象也發生變化。
        this.subject = subject;
        this.subject.attach(this);//將當前對象(Observer)添加到subject中的observers 
    }

    @Override
    public void update() {//subject發生變化,調用notifyAllObsever時更新顯示數據
        System.out.println("OctalObserver:" + subject.getState());
    }

}

 

 

Main對象

public class Main {
    public static void main(String[] args) {
        //建立subject,Observer依賴於subject,subject發生變化時,observer同時發生變化
        Subject subject = new Subject();
        //將object與subject綁定
        new BinaryObserver(subject);
        new OctalObserver(subject);
        //subject發生變化時,object同時發生變化
        subject.setState(10);
        subject.setState(20);
    }
}
運行結果:
BinaryObserver:1010 OctalObserver:10 BinaryObserver:10100 OctalObserver:20

 

 

參考資料:blog

https://www.runoob.com/design-pattern/observer-pattern.html

相關文章
相關標籤/搜索