前言
觀察者模式屬於行爲型模式,又被稱作發佈/訂閱模式。主要用來解耦,將觀察者和被觀察者解耦。
主要涉及四個角色:抽象觀察者、具體觀察者、抽象被觀察者、具體被觀察者。
代碼實現
(1)創建抽象觀察者:
/**
* 抽象觀察者
*/
public interface Observer {
void update(String message);
}
(2)創建具體觀察者:
/**
* 具體觀察者
*/
public class Boy implements Observer {
private String name;
public Boy(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println("我是======="+name+",======收到了消息==="+message);
}
}
/**
* 具體觀察者
*/
public class Girl implements Observer {
private String name;
public Girl(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println("我是======="+name+",======收到了消息==="+message);
}
}
(3)抽象被觀察者
/**
* 抽象被觀察者
*/
public interface Observable {
void add(Observer observer);//添加觀察者
void remove(Observer observer);//移除觀察者
void notifyData(String message);//通知觀察者
}
(4)具體被觀察者
public class Teacher implements Observable {
List<Observer> observerList=new ArrayList<>();
@Override
public void add(Observer observer) {//添加觀察者
observerList.add(observer);
}
@Override
public void remove(Observer observer) {//移除觀察者
observerList.remove(observer);
}
@Override
public void notifyData(String message) {//通知觀察者
if (observerList!=null&&observerList.size()>0){
for (Observer observer:observerList){
observer.update(message);
}
}
}
}
(5)測試
public class TestMain {
public static void main(String[] args) {
Observable observable=new Teacher();
Observer boy=new Boy("張三");
Observer girl=new Girl("麗麗");
observable.add(boy);
observable.add(girl);
observable.notifyData("開學了");
}
}
輸出結果:
我是=======張三,======收到了消息===開學了
我是=======麗麗,======收到了消息===開學了
Android中的常見的觀察者模式
(1)button的setOnClickListener監聽事件
(2)ListView的Adapter的notifyDataSetChanged()方法
(3)BroadcastReceiver
(4)RxJava、RxBus、RxAndroid、EventBus等