C#中的委托与Java中的接口回调
来源:互联网 发布:sql注入 or 编辑:程序博客网 时间:2024/06/13 19:03
最近因为业务需求学习起了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#中的委托与Java中的接口回调
- C#中的委托与事件
- C#中的委托与事件
- C#中的委托与事件
- C#中的委托与事件
- c#中的委托与事件
- c#中的委托与事件
- C#中的委托与事件
- C#中的委托与事件
- C#中的委托与事件
- C#中的委托与事件
- C#中的委托与事件
- C# 中的委托与事件
- c#中的委托与事件
- C#中的委托与事件
- C#中的委托与事件
- C#方法的委托和java中的回调
- C#中的委托与C语言的回调函数
- servlet的学习
- 对于任意多边形面积的求法
- apache的一些配置
- iOS 使用GCD多线程技术来处理耗时任务
- Java ZipFile 初窥
- C#中的委托与Java中的接口回调
- 快到连妈妈都不认识你的文件搜索工具 搜索everything
- wikioi1553 互斥的数
- W3c泥垢!如此耿直。。。你是来讲冷笑话的吗?
- 基于maven实现zxing二维码
- Android图片上下左右滑动特效--Recycker实现
- jquery表格的维护和删除
- 关于BQ40Z50-R1使用过程中的点点滴滴
- HDU 1016 素数环