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