场景
- 这里举一个列子,比如现在网上会有很多主播,比如什么大司马,55开,东北大鹌鹑等。就以这些主播为例,大司马有很多粉丝,每个人呢都可以关注他,或者取消关注,他发一条信息给所有他的粉丝说我今晚8点上线等.
第一种表达方式:自己定义观察者和被观察者接口
首先定义粉丝接口,会实时收到主播信息,这是肯定需要主播这个对象
public interface Observer {
void update(Subject subject);
}
然后定义主播类,主播会有很多粉丝,且可以被关注和被取消关注及发送消息
public class Subject {
//订阅者、客户称之为观察者
private List<Observer> list = new ArrayList<>();
public void register(Observer observer) {
list.add(observer);
}
public void cancel(Observer observer) {
list.remove(observer);
}
//通知所有订阅者更新状态
public void notifyAllObserver() {
for (Observer observer : list) {
observer.update(this);
}
}
}
现在定义一个具体主播,比如大司马
public class ConcreteSubject extends Subject {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
this.notifyAllObserver();
}
}
定义一个具体粉丝:粉丝的消息肯定只能接受主播发过来的消息
public class ObserverA implements Observer {
private String myMessage;
@Override
public void update(Subject subject) {
myMessage = ((ConcreteSubject) subject).getMessage();
}
public String getMyMessage() {
return myMessage;
}
public void setMyMessage(String myMessage) {
this.myMessage = myMessage;
}
}
测试
//大司马主播
ConcreteSubject subject = new ConcreteSubject();
//创建多个观察者
ObserverA obs1 = new ObserverA();
ObserverA obs2 = new ObserverA();
ObserverA obs3 = new ObserverA();
//将这三个观察者添加到subject对象的观察者队伍中
subject.register(obs1);
subject.register(obs2);
subject.register(obs3);
//改变subject的状态
subject.setMessage("今天晚上8点开主播");
System.out.println("########################");
//我们看看,观察者的状态是不是也发生了变化
System.out.println(obs1.getMyMessage());
System.out.println(obs2.getMyMessage());
System.out.println(obs3.getMyMessage());
//改变subject的状态
subject.setMessage("今晚发50000元大红包");
System.out.println("########################");
//我们看看,观察者的状态是不是也发生了变化
System.out.println(obs1.getMyMessage());
System.out.println(obs2.getMyMessage());
System.out.println(obs3.getMyMessage());
第二种表达方式:java SE提供java.util.Observable和java.util.Observer
主播:被观察着
public class ConcreteSubject extends Observable {
private String message;
public void setMessage(String message) {
this.message = message;
setChanged();//表示目标对象已经做了更改
notifyObservers(message); //通知所有的观察者
}
public String getMessage() {
return message;
}
}
粉丝:观察者
public class ObserverA implements Observer {
private String myMessage;
@Override
public void update(Observable o, Object arg) {
myMessage = ((ConcreteSubject) o).getMessage();
}
public String getMyMessage() {
return myMessage;
}
public void setMyMessage(String myMessage) {
this.myMessage = myMessage;
}
}