观察者模式包含以下几个核心角色:
- 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
- 观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
- 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
- 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。
例子:
我们都订阅了一些演出信息,当演出更新的时候,订阅的人也会收到信息。
public interface Subject {
void addObserve(Observer observer);
void deleteObserve(Observer observer);
void notification(String message);
}
public class NotificationPlatFormSubject implements Subject{
protected List<Observer> observers = new ArrayList<Observer>();
@Override
public void addObserve(Observer observer) {
observers.add(observer);
}
@Override
public void deleteObserve(Observer observer) {
System.out.println("退订中");
observers.remove(observer);
System.out.println("退订成功");
System.out.println("-------------");
}
@Override
public void notification(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
public interface Observer {
void update(String message);
}
public class Observer1 implements Observer{
@Override
public void update(String message) {
System.out.println("订阅中,observer1 收到信息:");
System.out.println(message);
System.out.println("--------------------------");
}
}
public class Observer2 implements Observer{
@Override
public void update(String message) {
System.out.println("订阅中,observer2 收到信息");
System.out.println(message);
System.out.println("------------------");
}
}
public class Client {
public static void main(String[] args) {
Observer observer1 = new Observer1();
Observer observer2 = new Observer2();
Subject notificationPlatFormSubject = new NotificationPlatFormSubject();
notificationPlatFormSubject.addObserve(observer1);
notificationPlatFormSubject.addObserve(observer2);
String message = "xxx演出将在三天后开始发售!";
notificationPlatFormSubject.notification(message);
notificationPlatFormSubject.deleteObserve(observer1);
String message2 = "xxx有新上线场次注意查收";
notificationPlatFormSubject.notification(message2);
}
}
结果
订阅中,observer1 收到信息:
xxx演出将在三天后开始发售!
--------------------------
订阅中,observer2 收到信息
xxx演出将在三天后开始发售!
------------------
退订中
退订成功
-------------
订阅中,observer2 收到信息
xxx有新上线场次注意查收
------------------