天天看點

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 = ; i < ; 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 = ; i < ; 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# 中的委托和事件(詳解)