自己画了个图
demo是用了两个场景来描述的,一个是找工作(查的资料),一个是购物,仿照写的,为了加深理解,根据名字可以知道订阅者和发布者,然后实体类分别取实现这两个接口类,来看订阅者
package com.fanyafeng.obser;
/**
* Created by fanyafeng on 16/6/27.
*/
public interface Observer {
public void update(Subject subject);
}
发布者:
package com.fanyafeng.obser;
/**
* Created by fanyafeng on 16/6/27.
*/
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyAllObservers();
}
这个真的可以类比一下网络购物,可以把一间店铺类比为发布者,然后消费者首先需要收藏可以类比订阅才能收到店铺的消息,如果店铺发消息的话肯定所有收藏店铺的都可以收到推送,在这也可以体会一下谁的业务比较复杂,来看具体实现
shop
package com.fanyafeng.obser.shopping;
import com.fanyafeng.obser.Observer;
import com.fanyafeng.obser.Subject;
import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;
/**
* Created by fanyafeng on 16/6/28.
*/
public class Shop implements Subject {
private ArrayList<Observer> customerList;
private ArrayList<String> messages;
public Shop() {
customerList = new ArrayList<>();
messages = new ArrayList<>();
}
//订阅消息
@Override
public void registerObserver(Observer observer) {
customerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
}
@Override
public void notifyAllObservers() {//发布者,通知所有订阅者
for (Observer observer : customerList) {
observer.update(this);
}
}
//店铺广播消息
public void postMessage(String message) {
this.messages.add(message);
notifyAllObservers();
}
public ArrayList<String> getMessages() {
return messages;
}
//店铺消息
public String toString() {
return messages.toString();
}
}
customer
package com.fanyafeng.obser.shopping;
import com.fanyafeng.obser.Observer;
import com.fanyafeng.obser.Subject;
/**
* Created by fanyafeng on 16/6/28.
*/
public class Customer implements Observer {
private String customer;
public Customer(String customer) {
this.customer= customer;
}
@Override
public void update(Subject subject) {//订阅者
System.out.println("收到店铺消息的消费者:" + this.customer);
System.out.println("店铺消息:" + subject.toString());
}
}
Shop shop = new Shop();
shop.registerObserver(new Customer("小红"));
shop.registerObserver(new Customer("小芳"));
shop.registerObserver(new Customer("广大女生"));
shop.postMessage("鞋子降价了");
shop.postMessage("零食降价了");
这样就ok了