1. 程式人生 > >C#中的委託與Java中的介面回撥

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# 中的委託和事件(詳解)