观察者模式归类为行为设计模式,观察者模式也叫做也叫作发布-订阅模式,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。
打个搞笑比方,警察抓小偷,警察是观察者, 小偷是被观察者,小偷出狱后,警察告诉小偷,你下次作案的时候,告诉我一声,我去抓你,小偷说,好啊。结果下次小偷作
案的时候,真的告诉警察了。
下面用代码来实现一下:
第一步:分别创建被观察者接口和观察者接口
package com.example.fwms.designmode.observer;
/**
* 创建 by 刘宇飞 on 2017/6/10.
* 邮箱:3494576680@qq.com
* 描述 观察者接口
*/
public interface Observer {
void grabThief();
}
package com.example.fwms.designmode.observer;
/**
* 创建 by 刘宇飞 on 2017/6/10.
* 邮箱:3494576680@qq.com
* 描述 被观察者接口
*/
public interface Observable {
// 添加观察者
void addObserver(Observer observer);
// 删除观察者
void removeObserver(Observer observer);
// 通知观察者
void notifyObservers();
}
第二步 实现接口编程 创建一个小偷 两个警察
package com.example.fwms.designmode.observer;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
/**
* 创建 by 刘宇飞 on 2017/6/10.
* 邮箱:3494576680@qq.com
* 描述 小偷
*/
public class SillyThief implements Observable {
private final String TAG=this.getClass().getName();
private List<Observer> observerList = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(observerList != null && observerList.contains(observer)){
observerList.remove(observer);
}
}
@Override
public void notifyObservers() {
Log.e(TAG,"我开始作案了,先告诉警察一声");
for (Observer observer : observerList) {
observer.grabThief();
}
}
}
package com.example.fwms.designmode.observer;
import android.util.Log;
/**
* 创建 by 刘宇飞 on 2017/6/10.
* 邮箱:3494576680@qq.com
* 描述 男警察
*/
public class Policeman implements Observer {
private final String TAG=this.getClass().getName();
@Override
public void grabThief() {
Log.e(TAG,"我是男警察来抓你了");
}
}
package com.example.fwms.designmode.observer;
import android.util.Log;
/**
* 创建 by 刘宇飞 on 2017/6/10.
* 邮箱:3494576680@qq.com
* 描述 女警察
*/
public class Policewoman implements Observer{
private final String TAG=this.getClass().getName();
@Override
public void grabThief() {
Log.e(TAG,"我是女警察来抓你了");
}
}
第三步 完成订阅关系
private void observer() {
//被观察者
Observable thief=new SillyThief();
//观察者
Observer man=new Policeman();
Observer woman=new Policewoman();
//添加观察者
thief.addObserver(man);
thief.addObserver(woman);
//通知被观察者
thief.notifyObservers();
}
打印log