两者都是用了实现接口的方式,谈谈异同
回调接口
重点是理解,哪里定义方法,哪里调用方法,以及接口实现
A向B提问,B思考一会儿,得到答案通知A
A中
1. 设置给B set 回调接口,
2. 定义回调方法,
3. 给B set问题,回调方法的参数中有问题答案
4. 调用B 解决问题的方法
B中:
1. 定义思考过程,即解决问题的方法,在解决方法中调用回调方法。
2. 定义一些set 方法
回调接口:
1. 定义接口
2. 方法声明
public class A {
private static final String TAG = "A";
public static void main(String[] args){
B b = new B();
b.setQusetion("1+1等于几?");
b.setCallBack(new Callback() {
@Override
public void callbackByTel(String answer) {
Log.e(TAG, "callbackByTel: 答案是:"+answer );
}
});
b.handleQustion();//也可以这里传入问题,无参方便理解
}
}
//==========================================================
public class B {
private Callback callback;
private String question;
public void setQusetion(String qusetion) {
this.question = qusetion;
}
public void setCallBack(Callback callback) {
this.callback = callback;
}
public void handleQustion() {
new Thread() {
@Override
public void run() {
for (int i = 1; i < 10; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
callback.callbackByTel("答案是2!!!");
}
}.start();
}
}
//===========================================
interface Callback {
void callbackByTel(String answer);
}
观察者模式
- 定义被观察者接口,声明方法 register(Observer),removeObserver(Observer),notifyObserver
- 定义观察者接口,生命方法 ,update(str)
- 被观察者实现接口,定义方法
- 观察者实现接口,定义方法
- 测试类中调用
/**
* 抽象被观察者接口,声明了添加,删除,通知观察者方法
* 专题接口,所有主题必须实现此接口
* @date 2018/8/3
*/
public interface Observerable{
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
//=============================================================
/**
* 定义一个抽象观察者接口,当被观察者调用notifyObserver()方法时,观察者update会被回调
* 所有观察者需要实现此接口
*
* @date 2018/8/3
*/
public interface Observer {
void update(String msg);
}
//================================================================
/**
* 定义被观察者,实现了Observerable接口,对Observerable接口的三个方法进行了具体实现,
* 同时有一个List集合,用以保存注册的观察者,等需要通知观察者时,遍历该集合即可
* 3D服务号的实现类
*
* @date 2018/8/3
*/
public class WechatServer implements Observerable {
/**
* 注意到这个List集合的泛型参数为Observer接口,
* 设计原则:面向接口编程而不是面向实现编程
*/
private ArrayList<Observer> observers = new ArrayList<>();
public void publishMsg(String msg) {
this.msg = msg;
notifyObservers();
}
String msg;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int index = observers.indexOf(observer);
if (index > 0) {
observers.remove(index);
}
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(msg);
}
}
}
//=====================================================
/**
* 定义被观察者
* 模拟第一个使用者
* @date 2018/8/3
*/
public class ObserverUser1 implements Observer {
public static final String TAG=ObserverUser1.class.getSimpleName();
public ObserverUser1(Observerable observerable) {
observerable.registerObserver(this);
}
@Override
public void update(String msg) {
Log.e(TAG, "得到3D号码: "+msg+" ,我要记下来" );
}
}
//======================================
/**
* Demo class
*
* @author pengjingang
* @date 2018/8/3
*/
public class ObserverUser2 implements Observer {
public static final String TAG = ObserverUser2.class.getSimpleName();
public ObserverUser2(Observerable observerable) {
observerable.registerObserver(this);//也可以定义到外面,由observable子类对象调用
}
@Override
public void update(String msg) {
Log.e(TAG, "得到3D号码: " + msg + " ,我要告诉舍友们");
}
}
//======================================
联系
- 观察者模式,一个被观察者,多个观察者或者说 一个通知者,多个接收者
- 回调接口,可以看作特殊的观察者,即 询问着为观察者,回答者为被观察着