设计模式原来这么简单-观察者模式
程序员文章站
2022-06-10 14:44:23
观察者模式1.什么是观察者模式WIKI: 一个类(称为主体)持有一组对象的实例(称为观察者),当一些状态变化时主题通常会通过调用观察者的一个方法来通知观察者。2.实例比如说天亮了,大人们出工,小孩去上学3.程序示例观察者的规范public interface IDayObserver { void sunRiseUpdate(); void sunSetUpdate();}public class Kid implements IDayObserver{...
观察者模式
1.什么是观察者模式
WIKI: 一个类(称为主体)持有一组对象的实例(称为观察者),当一些状态变化时主题通常会通过调用观察者的
一个方法来通知观察者。
2.实例
比如说天亮了,大人们出工,小孩去上学
3.程序示例
观察者的规范
public interface IDayObserver {
void sunRiseUpdate();
void sunSetUpdate();
}
public class Kid implements IDayObserver{
@Override
public void sunRiseUpdate() {
System.out.println("[Kid] 上学");
}
@Override
public void sunSetUpdate() {
System.out.println("[Kid] 回家");
}
}
public class Adult implements IDayObserver{
@Override
public void sunRiseUpdate() {
System.out.println("[Adult] 出工");
}
@Override
public void sunSetUpdate() {
System.out.println("[Adult] 收工");
}
}
public class Day {
public enum DayTypeEnum{
SUN_RISE,
SUN_SET
}
private DayTypeEnum dayType;
private List<IDayObserver> dayObserverList;
public Day(){
dayObserverList = new ArrayList<>();
}
public void addObserver(IDayObserver... observer){
dayObserverList.addAll(Arrays.asList(observer));
}
public boolean removeObserver(IDayObserver observer){
return dayObserverList.remove(observer);
}
public void changeDayType(DayTypeEnum dayType){
if(dayType.equals(this.dayType)) return;
this.dayType = dayType;
notifyAllObservers();
}
private void notifyAllObservers(){
switch (dayType){
case SUN_RISE:
sunRiseNotify();
break;
case SUN_SET:
sunSetNotify();
break;
}
}
public void sunRiseNotify(){
dayObserverList.forEach(IDayObserver::sunRiseUpdate);
}
public void sunSetNotify(){
dayObserverList.forEach(IDayObserver::sunSetUpdate);
}
}
4.测试
@Test
public void test(){
Day day = new Day();
Kid kid = new Kid();
Adult adult = new Adult();
day.addObserver(kid, adult);
day.changeDayType(Day.DayTypeEnum.SUN_RISE);
day.changeDayType(Day.DayTypeEnum.SUN_SET);
day.changeDayType(Day.DayTypeEnum.SUN_RISE);
day.changeDayType(Day.DayTypeEnum.SUN_SET);
}
5.测试输出
[Kid] 上学
[Adult] 出工
[Kid] 回家
[Adult] 收工
[Kid] 上学
[Adult] 出工
[Kid] 回家
[Adult] 收工
6.总结
当一个状态的变化需要通知到较多的类时,可以定义一个接口让这些类分别实现,然后由主体统一管理这些观察者并在状态变化时发出通知。
本文地址:https://blog.csdn.net/qq_41155089/article/details/112003198
下一篇: 类型萃取&类的模板特化