观察者模式简介
观察者模式
观察者模式有2种角色
- 被观察者
被观察者的入参对象,都是观察者的抽象接口 - 观察者
观察者的入参对象,都是被观察者的抽象接口
场景
微博
1)粉丝关注明星的账号
2)粉丝取消关注
3)明星的动态通知粉丝
被观察者接口
/**
* 被观察者,发布者 接口
*
*
* */
public interface Publisher {
/**
* 添加粉丝
* 入参为 观察者/订阅者 的抽象接口
*
* */
public void addFan(Subscriber subscriber);
/**
* 删除粉丝
* 入参为 观察者/订阅者 的抽象接口
*
* */
public void delFan(Subscriber subscriber);
/**
* 通知粉丝
*
* */
public void notifyFans();
}
观察者接口
/**
* 观察者,订阅者接口
*
*
* */
public interface Subscriber {
/**
* 关注明星
* 入参为 发布者/被观察者 抽象接口
*
* */
public void follow(Publisher publisher);
/**
* 取消关注
* 入参为 发布者/被观察者 抽象接口
*
* */
public void unfollow(Publisher publisher);
}
被观察者实现
public class ConcretePublisher implements Publisher{
private String name;
private List<Subscriber> subscriberList;
public ConcretePublisher(String name){
this.name=name;
}
@Override
public void addFan(Subscriber subscriber) {
if(CollectionUtils.isEmpty(subscriberList)){
subscriberList=new ArrayList<>();
}
if(subscriberList.contains(subscriber)){
System.out.println("已关注了明星");
return;
}
subscriberList.add(subscriber);
}
@Override
public void delFan(Subscriber subscriber) {
if(CollectionUtils.isEmpty(subscriberList) || subscriberList.contains(subscriber)){
System.out.println("未关注");
return;
}
Iterator<Subscriber> it=subscriberList.iterator();
while (it.hasNext()){
Subscriber curSub=it.next();
if(curSub.equals(subscriber)){
subscriberList.remove(subscriber);
}
}
}
@Override
public void notifyFans() {
if(CollectionUtils.isEmpty(subscriberList)){
System.out.println("没有粉丝");
return;
}
for(Subscriber subscriber:subscriberList){
System.out.println("我会唱歌,会跳舞");
}
}
}
观察者接口实现
public class ConcreteSubscriber implements Subscriber{
private String name;
public ConcreteSubscriber (String name){
this.name =name;
}
@Override
public void follow(Publisher publisher) {
publisher.addFan(this);
System.out.println(this.name+"关注了明星");
}
@Override
public void unfollow(Publisher publisher) {
publisher.delFan(this);
System.out.println(this.name+"取消了关注");
}
}