观察者模式是什么?
简单来说观察者模式就是订阅思想,
举例:订牛奶
我们订了牛奶,我们就是观察者了,然后牛奶公司会推送(发送)牛奶过来。
观察者的好处在于:
1.不需要自己去获取(比如牛奶公司来送牛奶)
2.删除观察者身份时很便捷(比如通知牛奶公司取消订牛奶即可),也就是主题和观察者之间松耦合(高内聚低耦合)
所以书中的这句话就能看懂了:
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
具体事例代码(订牛奶)
接口代码:
//主题(牛奶订阅中心)
public interface Subject {
//注册观察者
public void registerObserver(ObserverEntity o);
//移除观察者
public void removeObserver(ObserverEntity o);
//通知全体观察者
public void notifyObservers();
//通知单个观察者
public void notifyObserver(ObserverEntity o);
}
public interface Observer {
//这里更新观察者订阅信息(牛奶订阅信息)
public void update(String name,String address,String msg);
}
class代码:
1.具体订阅者
public class ObserverEntity implements Observer{
//订阅者名称
private String name;
//订阅者地址
private String address;
public ObserverEntity(String name, String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public void update(String name, String address, String msg) {
System.out.println("姓名:"+name+",地址:"+address+",消息:"+msg);
}
}
2.牛奶公司
//牛奶公司实现订阅中心的方法
public class milkCompany implements Subject {
//订阅者列表
private ArrayList observers;
//订阅者消息
private String msg;
public void setMsg(String msg) {
this.msg = msg;
}
public milkCompany() {
//创建观察者列表
observers=new ArrayList();
}
@Override
public void registerObserver(ObserverEntity o) {
//添加订阅者(观察者)到列表
observers.add(o);
}
@Override
public void removeObserver(ObserverEntity o) {
//判断订阅者(观察者)是否在列表中,在则删去
int i = observers.indexOf(o);
if(i>=0) {
observers.remove(i);
}
}
@Override
public void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {
ObserverEntity observer = (ObserverEntity)observers.get(i);
observer.update(observer.getName(), observer.getAddress(),msg);
}
}
@Override
public void notifyObserver(ObserverEntity o) {
o.update(o.getName(), o.getAddress(),msg);
}
}
3.具体的测试代码
public class Test {
public static void main(String[] args) {
//有一个牛奶公司
milkCompany company=new milkCompany();
//这里有2个意向订阅者(沙丁鱼和鲨鱼)
ObserverEntity sardine=new ObserverEntity("沙丁鱼","沙丁鱼星球");
ObserverEntity shark=new ObserverEntity("鲨鱼","海洋");
//牛奶公司将两位意向者注册进自己的列表
company.registerObserver(sardine);
company.registerObserver(shark);
//牛奶公司先宣布一条重大消息
company.setMsg("客户们,牛奶涨价啦!!");
company.notifyObservers();
//鲨鱼取消订阅了
company.removeObserver(shark);
//牛奶公司运送牛奶给沙丁鱼
company.setMsg("沙丁鱼,你的牛奶已到");
company.notifyObserver(sardine);
}
}
测试结果: