我看你同时问了两个问题,其实两者有关联的;所以我也就放一起来说了。
先来说是你的疑问:
回调不知道是啥
设计模式归类
其实说到这两个问题,我们一般会想到的是:接口、回调;而后就是设计模式。几乎所有的设计模式都脱离不了接口和回调。
先来说说单例;这个很简单,一般很少用到我说的接口啊,回调啥的;这是因为这个模式本身没有啥复杂的地方,如果加上了延迟初始化,以及抽象那么就需要用到接口或者回调了;接口用来做职责的定义,回调可以用来做初始化状态的通知。
对于观察者,那就更是太多了;咱们的整个项目其实观察者模式用的非常多,比如Channel的状态回调、数据的发送通知都是观察者的运用。而在这个模式中:接口肯定是有的了,回调也是必须的。
回到我们的问题,回调是什么?课程说了那么多的回调到上层、外层是啥意思。
> 我举个例子:一位老板接到一个任务,但是这个任务他并不打算自己去做,因为这不合身价;所以他交给他的下属;OK。
这里的任务就是一个要做的事情,而他和他的下属可以想成两个独立的类:Boss、Staffer。
Boss 把任务交给了 Staffer;是不是就等于调用了一个 Staffer 的方法,并且传递了某些参数给他。这里的参数就是任务的属性,而调用的方法就是安排Staffer去做某个事情,而Staffer也有着这样的能力去完成。
当然在这个过程中,老板需要知道下属的状态,比如是否做完了啊,是否有遇到问题啥的吧?
但是老板又觉得每次自己去问Staffer是不是不合适啊,老板天天来问,是不是显得不合适啊。更好的是不是应该员工自己传递状态给Boss?
那么OK,这里就涉及到传递状态给Boss,他可以打电话、可以发右键、可以IM、也可以直接去老板办公室告诉Boss。
无论怎样,Staffer肯定有某种方式告诉给Boss状态;而把这个过程抽象一下就是接口StatusCallback。
Staffer调用StatusCallback回送状态给Boss的过程就叫做:回调!!!!
那么课程里的上层、外层、上级就是Boss,就是员工的老板,这是在不同的业务场景下的叫法而已。
我们把上面的过程给实现为代码就是这样:
public class Staffer {
public interface StatusCallback {
void onDone(boolean isSucceed);
}
public void doWork(int value, StatusCallback callback) {
// 做某些事情
// 完成后回调状态给外层
// 至于外层是Boss还是其他同事都是可以的
// 在这里只是因为这个任务是Boss指派给他的,所以他回调给Boss
// 如果是普通员工指派,那就回调给其他员工
callback.onDone(true);
}
}
public class Boss implements Staffer.StatusCallback {
// 老板下面有一个员工
Staffer staffer = new Staffer();
void setup() {
// 任务属性
int value = 100;
// 这里交给员工做事情,并且传递任务参数
// this就是Boss自己,因为Boss自己实现了Staffer.StatusCallback接口
// Boss 也就具备监听员工状态的能力
staffer.doWork(value, this);
}
@Override
public void onDone(boolean isSucceed) {
// 最终员工的行为结果将回调到这里来
}
}
那么这里:StatusCallback 就是一个接口,同学可能会疑问为啥StatusCallback需要写到Staffer内部,其实写到外层作为独立的类也是可以,只是写到内部更能表现为是Staffer的状态回调。因为在Boss中使用的时候是:
implements Staffer.StatusCallback
Staffer.StatusCallback 写起来明显就能看出是Staffer的状态回调;这是一种字面就能表现意图的技巧。
上面举例的也是设计模式:观察者模式的实现。
在咱们课程中观察者也是用的较多的一种,当然还有门面模式、工厂模式、单例、适配器、组合模式.... 其实有很多的。
一般来说多看,实际使用的时候会有一定的变化,并不一定完全去套用某个设计模式;只需要更好的完成意图就好了。