本文介绍使用枚举的方式实现的观察者模式,简单易用,容易维护,非常适合日常的开发使用。
// 定义一个观察者接口,用于观察主题对象的状态变化
public interface Observer {
// 发布消息
void update(String message);
}
package com.jareny.jave.design.observer.object.base;
// 实现观察者接口的具体类,用于观察主题对象的状态变化
public class ConcreteObserver implements Observer{
@Override
public void update(String message) {
System.out.println("观察到主题对象的状态变化,具体类收到通知:" + message);
}
}
package com.jareny.jave.design.observer.object.base;
// 定义一个主题接口,被观察者接口,用于通知观察者对象状态变化
public interface Subject {
// 注册观察者
void registerObserver(Observer observer);
// 删除观察者
void removeObserver(Observer observer);
// 通知观察者
void notifyObservers(String message);
}
package com.jareny.jave.design.observer.object.base;
import java.util.ArrayList;
import java.util.List;
// 实现主题接口,被观察者接口的具体类,用于通知观察者对象状态变化
public class ConcreteSubject implements Subject {
private List observers = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
observers.forEach(observer->observer.update(message));
}
}
package com.jareny.jave.design.observer.object.enums;
import com.jareny.jave.design.observer.object.base.ConcreteObserver;
import com.jareny.jave.design.observer.object.base.Observer;
import com.jareny.jave.design.observer.object.base.Subject;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Getter
@AllArgsConstructor
public enum ObserverEnum {
/**
* 第一个观察者
*/
Observer1("张三","学生"){
@Override
public void register(Subject subject) {
// 创建观察者对象1
Observer observer = new ConcreteObserver();
// 主题对象注册观察者对象1
subject.registerObserver(observer);
}
},
/**
* 第二个观察者
*/
Observer2("李四","老师"){
@Override
public void register(Subject subject) {
// 创建观察者对象2
Observer observer = new ConcreteObserver();
// 主题对象注册观察者对象2
subject.registerObserver(observer);
}
},
;
// 名称
private String name;
// 类型
private String type;
/**
* 注册观察者
* @param subject
*/
public abstract void register(Subject subject);
/**
* 获取所以的观察者
* @return
*/
public static List getObserverEnumList(){
return Stream.of(values()).collect(Collectors.toList());
}
}
package com.jareny.jave.design.observer.object.enums;
import com.jareny.jave.design.observer.object.base.ConcreteObserver;
import com.jareny.jave.design.observer.object.base.ConcreteSubject;
import com.jareny.jave.design.observer.object.base.Observer;
import com.jareny.jave.design.observer.object.base.Subject;
import java.util.List;
public class ObserverEnumExample {
public static void main(String[] args) {
// 创建主题对象
Subject subject = new ConcreteSubject();
// 创建观察者对象列表
List observerEnumList = ObserverEnum.getObserverEnumList();
// 观察者对象全部注册到主题对象
observerEnumList.forEach(observer->observer.register(subject));
// 主题对象通知所有观察者对象状态变化
subject.notifyObservers("主题对象状态发生变化!");
}
}
使用枚举,将观察者注册到订阅的主题种
运行程序,得到以下结果
观察到主题对象的状态变化,具体类收到通知:主题对象状态发生变化!
观察到主题对象的状态变化,具体类收到通知:主题对象状态发生变化!