观察者模式需要如下几个对象构建出整个框架: 1抽象主题角色:提供了一个用于保存观察者对象的聚集类和增加删除观察者对象的方法,以及通知所有观察者的抽象方法 2具体主题:具体目标类,实现抽象主题的类 3抽象观察者:是一个抽象类接口,包含一个更新自己的抽象方法,更改通知时随时被调用 4具体观察者
具体例子
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class client {
public static void main(String[] args) {
// 人民日报开通公众号
WeChatSubscribe peopleDaily = new PeopleDaily();
//关注订阅
peopleDaily.add(new ZhangSan());
peopleDaily.add(new LiSi());
peopleDaily.sendMessage = "hhh";
peopleDaily.notifyObserver();
}
}
// 抽象主题
abstract class WeChatSubscribe {
// 定义观察者集合
protected List<AbstractOB> observers = new ArrayList<AbstractOB>();
public String sendMessage = "";
// 添加观察者方法
public void add(AbstractOB observer) {
observers.add(observer);
}
// 移出观察者方法
public void remove(AbstractOB observer) {
Iterator<AbstractOB> iterator = observers.iterator();
while (iterator.hasNext()) {
AbstractOB next = iterator.next();
if (next == observer) {
iterator.remove();
}
}
// observers.remove(observer);
}
// 发送消息的行为
public abstract void notifyObserver();
}
// 抽象观察者
abstract class AbstractOB {
abstract void response(WeChatSubscribe subscribe);
}
// 具体目标
class PeopleDaily extends WeChatSubscribe {
@Override
public void notifyObserver() {
System.out.println("今天是雨天" + sendMessage);
for (AbstractOB ob : observers) {
ob.response(this);
}
}
}
// 具体目标2
//class BJ extends WeChatSubscribe{}
//具体观察者1-张三
class ZhangSan extends AbstractOB {
public void response(WeChatSubscribe subscribe) {
System.out.println("张三作为具体观察者,听了很伤心");
}
}
//具体观察者2-李四
class LiSi extends AbstractOB {
public void response(WeChatSubscribe subscribe) {
System.out.println("李四作为具体观察者,听了很高兴");
//取下观察
System.out.println("当前的订阅人数" + subscribe.observers.size());
subscribe.remove(this);
System.out.println("移除后订阅人数" + subscribe.observers.size());
}
}