最近因为业务需求学习起了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# 中的委托和事件(详解)