觀察者模式

1.定義 (本身面試說了觀察者模式,可是問起來被問住兩次,不總結不行)

在對象之間定義了一對多的依賴,當一個對象改變狀態,依賴它的對象會收到通知並自動更新。java

2.實現

2.1定義觀察者接口

public interface Observer {
    public void update(String message);

}

包含了收到通知後執行的操做.面試

2.2定義被觀察者接口

public interface Observerable {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();
}

包含註冊,刪除,通知等功能.微信

2.3實現具體的觀察者

public class User implements Observer{
    private String name;
    private String message;
    
    
    
    public User(String name) {
        super();
        this.name = name;
    }



    @Override
    public void update(String message) {
        this.message = message;
        read();
    }
    
    public void read() {
        System.out.println(name+" 收到 " + message);
    }

}

 

2.4實現具體的被觀察者

package observer3;

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

public class WechatServer implements Observerable{
    private List<Observer> list;
    private String message;
    
    
    public WechatServer() {
        list = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        list.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        if (!list.isEmpty()) {
            list.remove(o);
        }
    }

    @Override
    public void notifyObserver() {
        for (Observer o : list) {
            o.update(message);
        }
    }
    
    public void setInformation(String s) {
        this.message = s;
        System.out.println("通知者發送:"+s);
        notifyObserver();
    }

}

以微信的公衆號通知爲例子,裏面包含了list接口,能夠經過 setInformation 方法遍歷list來通知觀察者.ide

3.測試

  

public class TestObserver {
    public static void main(String[] args) {
        WechatServer observerable = new WechatServer();
        
        Observer ob1 = new User("ob1");
        Observer ob2 = new User("ob2");
        Observer ob3 = new User("ob3");
        Observer ob4 = new User("ob4");
        
        observerable.registerObserver(ob1);
        observerable.registerObserver(ob2);
        observerable.registerObserver(ob3);
        observerable.registerObserver(ob4);
        
        
        
        observerable.setInformation("hello world");
    }

}

被問到的兩個面試題: 測試

1.觀察者模式是什麼?  this

  存在觀察者和被觀察者兩個對象,二者是一對多的關係,當被觀察者發出通知的時候,觀察者能夠收到通知並執行相應的操做.spa

實現是經過定義 觀察者 和 被觀察者兩個接口, 被觀察者 能夠註冊和刪除 觀察者,在實現類裏面這個是經過list接口實現的, 經過遍歷list 集合來調用觀察者的方法來通知.code

2.何時應該通知觀察者?orm

在觀察者實現類中的屬性改變的時候或者根據具體需求定義的方法來調用notify方法通知.server

須要結合具體需求.

相關文章
相關標籤/搜索