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

你可能感兴趣的:(C#)