先簡(jiǎn)單介紹一下觀察者模式:在對(duì)象之間定義一對(duì)多的依賴,這樣當(dāng)一個(gè)對(duì)象改變狀態(tài)宏所,依賴它的對(duì)象都會(huì)收到通知,并自動(dòng)更新。
相信大家對(duì)回調(diào)都非常熟悉了,這里可以把回調(diào)看作是觀察者模式的一種特殊類型离福,即只有一個(gè)觀察者。
下面用圖來(lái)描述一下觀察者和被觀察者之間的關(guān)系:
?張三炼蛤,趙四妖爷,王五都訂了牛奶。送奶工過(guò)來(lái)后通知他們過(guò)來(lái)取奶理朋,這時(shí)某六看到絮识,也想訂奶,就和送奶工說(shuō)以后也給我送嗽上。之后送奶工就給他們四人送奶次舌。
某天張三不想喝奶了,就和送奶工說(shuō)我不喝了兽愤,以后別給我送了彼念。之后送奶工就只給趙四,王五烹看,趙六送奶了
圖畫(huà)的不好国拇,請(qǐng)大家忍住別笑,下面說(shuō)一下送奶工(被觀察者)的工作流程惯殊。
在這里張三酱吝,趙四,王五土思,某六都是觀察者务热。在第一幅圖片中某六并沒(méi)有訂奶忆嗜,所以沒(méi)有收到送奶工的通知。于是它和送奶工說(shuō)我也要喝牛奶崎岂,就訂閱了捆毫。
之后送奶工就給四個(gè)人送奶并通知他們。某天張三不想喝奶了冲甘,就告訴送奶工說(shuō)我不想喝牛奶了绩卤,以后別送了。這時(shí)他就取消了訂閱江醇,之后送奶工就不再通知張三過(guò)來(lái)取奶了濒憋。
好了,圖片介紹完了陶夜,下面上代碼凛驮。
在這里將被觀察者抽象為一個(gè)接口,這樣當(dāng)這個(gè)送奶工哪天不想做了的時(shí)候条辟,我們可以立刻換個(gè)送奶工代替他去工作:
public interface Subject {
//注冊(cè)觀察者
void registerObserver(MyOberver o);
//移除觀察者
void removeObserver(MyOberver o);
//通知觀察者
void notifyObservers();
}
接下來(lái)定義觀察者的接口,這里只有一個(gè)方法黔夭,取奶:
public interface MyOberver {
//取奶
void getMilk();
}
接下來(lái),讓送奶工 A實(shí)現(xiàn)subject:
public class A implements Subject {
//創(chuàng)建一個(gè)集合羽嫡,管理觀察者
private List<MyOberver> observers;
public A(){
observers = new ArrayList<>();
}
@Override
public void registerObserver(MyOberver o) {
//每注冊(cè)一個(gè)觀察者?本姥,將他加入觀察者集合中
observers.add(o);
}
@Override
public void removeObserver(MyOberver o) {
//獲得觀察者在集合中的索引,并移除
int i = observers.indexOf(o);
if ( i >= 0){
observers.remove(i);
}
}
@Override
public void notifyObservers() {
//遍歷集合中的觀察者厂僧,并通知他們?nèi)∧? for(int i = 0; i < observers.size(); i++){
MyOberver oberver = observers.get(i);
oberver.getMilk();
}
}
}
然后定義被觀察者:
public class Observer implements MyOberver {
private Subject milkStuff;
private String name;
public Observer(Subject milkStuff,String name) {
this.milkStuff = milkStuff;
//在構(gòu)造方法中將當(dāng)前對(duì)象注冊(cè)當(dāng)觀察者集合中
milkStuff.registerObserver(this);
this.name = name;
}
@Override
public void getMilk() {
System.out.println("我是" + name + ",馬上來(lái)取奶...");
}
}
最后寫一個(gè)main方法測(cè)試就ok啦
public static void main(String[] args) {
A milkStuff = new A();
MyOberver zs = new Observer(milkStuff,"張三");
MyOberver ls = new Observer(milkStuff,"李四");
MyOberver ww = new Observer(milkStuff,"王五");
MyOberver ml = new Observer(milkStuff,"某六");
milkStuff.notifyObservers();
}
在這里我只是簡(jiǎn)單的闡述了觀察者模式的原理扣草,幫助大家弄懂這種優(yōu)秀的設(shè)計(jì)模式。真正應(yīng)用起來(lái)肯定會(huì)比這個(gè)例子復(fù)雜的多颜屠。
希望自己在成為大牛的路上愈行愈遠(yuǎn)辰妙,與大家共勉
?