社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,==一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知==。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
季度分享差不多落幕,大家满心期待大波的审批结果,没人心里无时无刻不想去大波那里问一下结果如何,但是这样大波心里叫苦,每时每刻都有人来骚扰,不胜其烦,所以,观察者模式出场
package com.jack.idea.test.designmode;
import java.util.ArrayList;
import java.util.List;
/**
* 观察者模式
*
* @author ljs.song
* @date 2018-01-02 10:40
*/
public class ObserverClient {
public static void main(String[] args) {
//大boss大波出场
DaboSubject daboSubject = new DaboSubject();
//小杰向大boss表明想第一时间知道结果
XiaoJieObserver xiaoJieObserver = new XiaoJieObserver();
daboSubject.registerObserver(xiaoJieObserver);
//小臣也想知道结果
XiaoChenObserver xiaoChenObserver = new XiaoChenObserver();
daboSubject.registerObserver(xiaoChenObserver);
//小龙表示我也想知道
XiaoLongObserver xiaoLongObserver = new XiaoLongObserver();
daboSubject.registerObserver(xiaoLongObserver);
//大波进行一次初步评审变动
daboSubject.notifyAllObserver("大家好我初步做了评审,请查看是否有疑问");
System.out.println("--------------------------");
//小龙觉得有疑问,告诉了大波,大波重新修改了小龙的评审结果
daboSubject.notifyObserver(2,"我给你改了,再看下有没有问题");
}
}
/**
* 被观察者,主题
*/
abstract class Subject{
protected List<Observer> observers = new ArrayList<>();
void registerObserver(Observer observer){
if(observer != null && !observers.contains(observer)){
observers.add(observer);
}
}
void removeObserver(Observer observer){
if(observer != null && observers.contains(observer)){
observers.remove(observer);
}
}
/**
* 通知全部观察者
*/
abstract void notifyAllObserver(String messages);
/**
* 通知指定观察者
* @param i
* @param message
*/
abstract void notifyObserver(int i,String message);
}
/**
* 观察者
*/
interface Observer{
void update(String message);
}
/**
* 大波,真正的被观察者
*/
class DaboSubject extends Subject {
/**
* 状态变化后通知各个观察者
*/
@Override
public void notifyAllObserver(String message) {
for (Observer observer1 : this.observers) {
observer1.update(message);
}
}
@Override
void notifyObserver(int i,String message) {
observers.get(i).update(message);
}
}
/**
* 小杰接受被观察者的信息
*/
class XiaoJieObserver implements Observer{
@Override
public void update(String message) {
System.out.println("小杰收到通知:" + message);
}
}
/**
* 小臣等待被观察者的信息
*/
class XiaoChenObserver implements Observer{
@Override
public void update(String message) {
System.out.println("小辰收到通知:" + message);
}
}
/**
* 小龙等待信息公布
*/
class XiaoLongObserver implements Observer{
@Override
public void update(String message) {
System.out.println("小龙收到通知:" + message);
}
}
转载请注明出处 阿布的夏天
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!