C#中的委託與Java中的介面回撥
最近因為業務需求學習起了C#,對於學過Java的人來說,C#其實還是挺好懂的,基本上很多語法都是相通的。今天就談談我對C#和Java中不同的地方的理解吧。
說到Java中的介面回撥那麼就不得不提觀察者設計模式,所謂觀察者模式就是A(觀察者 Observer)和B(被觀察者 Observable)兩者,當B發生了某種特定的情況,會通知A去某件事情。具體的例子就是當天黑了路燈就會亮,這裡的路燈就是觀察者,天就是被觀察者。
觀察者模式在Java中的實現就是通過介面的回撥來實現的,具體來說就是被觀察者持有觀察者的物件,當發生某種情況時,被觀察者直接通過持有的觀察者物件呼叫相應的方法。當然,為了減少耦合,被觀察者一般會設計一個介面,在介面中定義若干個指定的方法,當發生具體情況時,就呼叫該介面中具體的辦法,而觀察者則需要實現該介面。這樣的話被觀察者只需要持有一個介面例項就行了,而這個例項可以通過一個公共的方法暴露出來。具體的程式碼如下:
public class Observable {
private CallBack mCallBack;
public void setCallBack(CallBack mCallBack) {
this.mCallBack = mCallBack;
}
public void run() {
for (int i = 0; i < 100; i++) {
if (mCallBack != null) {
mCallBack.doSomeThing(i);
}
}
}
}
public interface CallBack {
void doSomeThing(int i);
}
public class Observer implements CallBack {
@Override
public void doSomeThing(int i) {
// 具體需要觀察者自己做的事情
System.out.println("列印數字:" + i);
}
}
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer();
observable.setCallBack(observer);
observable.run();
}
其實在C#裡面也是可以通過這樣的方法來實現觀察者模式的,不過C#中有更好的做法(個人認為),那就是委託。在C#中有一個關鍵字叫delegate。具體做法就是在被觀察者中宣告一個delegate,然後定義一個該delegate的物件,對於需要呼叫的觀察者中的方法都通過這個delegate物件來進行。可能直接說有點抽象,下面直接上程式碼:
public delegate void CallBack(int i);
public class Observable{
public CallBack mCallBack;
public Observable(){
mCallBack = new CallBack();
}
public void run(){
for (int i = 0; i < 100; i++) {
mCallBack(i);
}
}
}
public class Observer{
public void doSomeThing(int i){
Console.WriteLine("列印數字:" + i);
}
}
public static void Main(String[] args) {
Observable mObservable = new Observable();
Observer mObserver = new Observer();
mObservable.mCallBack+=mObserver.doSomeThing;
mObservable.run();
}
從上面程式碼我們可以看到,實際上Java中我們定義的介面在C#中變成了delegate,這樣觀察者和被觀察者間就不會再有依賴關係(從目前我的理解來看是沒有的,因為雙方都沒有持有對方的物件)。而且程式碼量也精簡了很多,而且在Java中如果介面中定義了N個方法,那麼這些方法你都需要實現,但是實際上有時候你並不需要實現這些方法,這樣就新增很多臃腫的程式碼,而C#裡面你卻可以選擇性的來註冊這些事件。並且通過event關鍵字的話,程式碼還能進一步精簡。
以上就是我對於C#和Java在觀察者設計模式中運用的理解,C#部分主要還是看這篇文章明白的,感謝一下這位博主!C# 中的委託和事件(詳解)