java中實(shí)現(xiàn)觀察者模式有很多種方式,上一篇文章介紹到了,利用callback的方式實(shí)現(xiàn)了回調(diào),這篇文章準(zhǔn)備介紹的是利用listener實(shí)現(xiàn)回調(diào)。
Java回調(diào)機(jī)制
根據(jù)實(shí)時(shí)性劃分:
實(shí)現(xiàn)方式
- 利用匿名內(nèi)部類即callbck來實(shí)現(xiàn)
- 用listener來實(shí)現(xiàn)
這兩種實(shí)現(xiàn)方式本質(zhì)上是類似的,應(yīng)用場景略有不同,如果有熟知安卓的朋友應(yīng)該可以知道,在為一個(gè)view添加點(diǎn)擊實(shí)現(xiàn)的時(shí)候是有兩種方式的
- 利用callback來實(shí)現(xiàn)
view.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
}
});
2.實(shí)現(xiàn)View.OnClickListener接口
public class Test extends AppCompatActivity implements View.OnClickListener {
private Button button;
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button = (Button) findViewById(R.id.ac_video_btn_getValue);
button.setOnClickListener(this);
}
@Override public void onClick(View view) {
//TODO
}
}
回調(diào)的本質(zhì)
其實(shí)無論哪種方式來實(shí)現(xiàn)回調(diào),利用的思想都是觀察者模式,即在我們選擇訂閱之后,當(dāng)對(duì)方做出任何舉動(dòng)的時(shí)候會(huì)給我們發(fā)送一條信息,這樣做的好處是省著我們用一個(gè)新的線程輪訓(xùn)檢測對(duì)方的狀態(tài),可以節(jié)省很多的資源。
應(yīng)用的場景
如果我們需要將信息一層一層的返回去的時(shí)候,正如我下面的例子,那么可能用listener更為適合我們,因?yàn)槲覀兛梢詫⑦@個(gè)listener進(jìn)行傳遞,在需要查看數(shù)據(jù)的時(shí)候進(jìn)行回調(diào)它?;蛘弋?dāng)我們有很多事件需要回調(diào)的時(shí)候,可以實(shí)現(xiàn)一個(gè)listener然后發(fā)送不同的信息,進(jìn)行區(qū)分。這樣代碼看起來會(huì)簡潔一些,不會(huì)像callback一樣,會(huì)嵌套很多層,也不會(huì)寫出很多個(gè)callback來。
如果我們只有一處,或者簡單的幾處需要回調(diào)的話,那么我們完全可以不用實(shí)現(xiàn)這個(gè)接口,而是用callback的方式來進(jìn)行處理。
還是舉一個(gè)簡單的生活中的例子吧,在公司中有一件事情,老板想要問員工,但是老板只能聯(lián)系到部門經(jīng)理,那么便有了,A問B,B問C,C經(jīng)過思考,回答了B,B又將答案告訴了A,A知道了答案,便高興的說了出來。
我下面的代碼采用了單例模式來寫:
Listner.java
public interface Listener {
void onFinish(String msg);
}
People.java
public class People implements Listener {
private static People people;
private People() {
}
synchronized public static People getInstance() {
if (people == null) {
people = new People();
}
return people;
}
public void askPeople2() {
People2.getInstance().askPeople3(this);
}
@Override
public void onFinish(String msg) {
System.out.println("收到的消息是 ---> " + msg);
}
}
People2.java
public class People2 {
private static People2 people2;
private People2() {
}
synchronized public static People2 getInstance() {
if (people2 == null)
people2 = new People2();
return people2;
}
public void askPeople3(Listener listener){
People3.getInstance().thinking(listener);
}
}
People3.java
public class People3 {
private static People3 people3;
private People3() {
}
synchronized public static People3 getInstance() {
if (people3 == null)
people3 = new People3();
return people3;
}
public void thinking(Listener listener3) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
listener3.onFinish("我已經(jīng)思考完畢");
}
}
