观察者模式
创始人
2024-03-24 12:54:08

目录

一、观察者模式解决了哪些问题:

二、体检的小栗子

三、什么是观察者模式

四、代码实现


一、观察者模式解决了哪些问题:

  • 对象之间的一对多依赖关系应该在不使对象紧密耦合的情况下定义。
  • 应该确保当一个对象改变状态时,自动更新无限数量的依赖对象。
  • 一个对象可以通知无限数量的其他对象应该是可能的。

二、体检的小栗子

举一个生活中常见的小栗子。你想要了解自己的身体状况。

方案一:

想要了解自己眼睛,健康状况,去A医院,挂一个眼科进行检查

想要了解自己血糖,健康状况,去B医院,挂一个内科进行检查

想要了解自己肝功能状态,,去C医院,挂一个号进行检查。

方案二:做一个体检项目

做一个体检项目,项目里包含身高、体重、视力、血糖、肝功能等一系列检查。

如果我还想检查更多的项目,可能在体检套餐里加入特定的体检项目。

观察者模式:

体检(类)-检查(方法)

写一个体检接口,里面有检查方法。然后多个实现类:

体重类,需要实现体检接口的检查方法

身高类,需要实现体检接口的检查方法。

目的就是把所有的类,在类型上统一,都归属于体检类,这样就可以组成一个体检集合,然后遍历每个元素的检查方法

--------------------------------------------------------------------------------------------------------------------------

三、什么是观察者模式

主要解决:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

四、代码实现

需要进行体检的人类Person

package ObserverDemo;import lombok.Data;@Data
public class Person {private String name;private int height;private int weight;private int vision; // 视力private String lung;// 肺部private String blood; // 血液}

体检接口HealthCheckupIObserver,有检查身体的方法

package ObserverDemo;public interface HealthCheckupIObserver {void check(T t);
}

体检医院内,视力科室(Eye类)实现体检接口,来检查视力

package ObserverDemo;public class Eye implements HealthCheckupIObserver{@Overridepublic void check(Person person) {System.out.println("进行视力检查");}
}

体检医院内,内科室实现体检接口,来检查肺部

package ObserverDemo;public class InternalMedicine implements HealthCheckupIObserver{@Overridepublic void check(Person person) {System.out.println("内科进行肺部检查");}
}

体检医院内,外科科室实现体检接口,来检查身高

package ObserverDemo;public class Surgery implements HealthCheckupIObserver{@Overridepublic void check(Person person) {System.out.println("外科进行身高检查");}
}

体检单ObserverManager

将各种体检项目,加入到这个体检单里。也可以将体检单里的某一体检项目剔除。

package ObserverDemo;import com.google.common.collect.Lists;import java.util.List;public class ObserverManager {// 各种检查项目,组成一个体检单/listprivate List observers;// 构造器,私有,不能被newprivate ObserverManager(){observers = Lists.newArrayList(new InternalMedicine(),// 将 内科检查,加入到体检单new Eye(), // 将眼科检查,加入到体检单new Surgery() // 将外科检查,加入到体检单);}// ClassHolder属于静态内部类,在加载类Demo03的时候,只会加载内部类ClassHolder,// 但是不会把内部类的属性加载出来private static class ClassHolder{// 这里执行类加载,是jvm来执行类加载,它一定是单例的,不存在线程安全问题// 这里不是调用,是类加载,是成员变量private static final ObserverManager holder =new ObserverManager();}public static ObserverManager of(){//第一次调用getInstance()的时候赋值return ClassHolder.holder;}public void check(Person person){for (HealthCheckupIObserver observer:observers){observer.check(person);}}}

小明同学,使用体检单进行体检。

package ObserverDemo;public class APP {public static void main(String[] args) {Person person = new Person();ObserverManager.of().check(person);}
}

感觉观察者的核心就是:

定义一个观察者接口,具体执行逻辑的类来实现它。就是为了能够将这几个实现类,组合成一个集合。然后调用遍历每个元素的方法。

在这个例子里,观察者的核心就是:

将各个检查项目,组装成了一个体检单。(体检单里可以增加或者剔除某个体检项目)

UML类图

项目结构:

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...