委托的设计思想
委托的设计思想
在上一文中,我们简单的了解了一下,委托的机制,那么本文我们来了解一下委托的设计思想。
Overview
我想你已经体验到了委托带来的好处,试想一下,这么好用的东西,其他编程语言中肯定也有类似的东西,毕竟天下文章一大抄..呃 口胡。如果你是有过Android开发经验的,我想你肯定对Android中各种各样的Listener十分深刻,Android中的Listener就是一种类似我们C#委托的东西,在Java中被称为 回调函数
。
Java的回调机制
Java 中的回调机制,是通过传递接口来实现的,下面我们来看一看。设想下面的这么一种情况: 有一个Person类 ,其中有一个方法叫做
introduce
方法,来介绍自己,当介绍完成之后,执行一个方法来告诉系统已经介绍完毕。
建立一个用来通知系统,Person已经介绍完毕的接口。
public interface IntroducedCallBack {
void Introduced(Person person);
}
Person类
import javax.annotation.processing.SupportedSourceVersion;
public class Person {
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
/**
* 该person 介绍自己的方法
* @param callBack 当介绍完自己后的回调方法
* */
public void introduce(IntroducedCallBack callBack) {
System.out.println("My name is " + this.name + "I am " + age + "years old. I my a " + gender);
if (callBack != null)
callBack.Introduced(this);
}
}
进行调用
public class Program {
public static void main(String[] args) {
Person person = new Person("鲁迅认识的那只猹", 18, "Male");
person.introduce(new IntroducedCallBack() {
@Override
public void Introduced(Person person) {
System.out.println("好的!"+person.getName() +" 系统收到了你的介绍!");
}
});
}
}
最后的输出结果为
My name is 鲁迅认识的那只猹I am 18years old. I my a Male
好的!鲁迅认识的那只猹系统受到了你的介绍!
分析
我们在 person 调用 introduce 方法的时候,传递了我们的实例化后的接口,在这里通过接口的方式完成了类似C#委托机制的功能
Person 类 调用了 Program类的方法
。可能你并没有学过Java但是我想上面的代码同样可以被轻易的理解,毕竟这两个语言是非常相似的。
结语
如果你学过设计模式,我想是你一定在上面的代码中看到了
发布-订阅
设计模式的影子,可能在这里并不是很明显,毕竟这个例子的代码太少了。 C#中委托的设计借鉴了发布订阅模式的思想,在C#没有委托之前,我们实现 发布-订阅 设计模式的时候,也是通过接口来实现的,但是有了委托之后,C#可以通过多播委托来实现发布订阅设计模式。关于多播委托下文会有详细的介绍。