系列文章目录
前言
今天给大家介绍另一种设计模式--观察者模式,有了解webscoket实现原理的小伙伴应该对这个设计模式不陌生。不清楚也没关系,今天就给大家介绍一下这个设计模式。🌈
一、什么是观察者模式
观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系。在该模式中,一个目标对象管理所有依赖于它的观察者对象,并在其状态改变时主动发出通知。
在观察者模式中,主要有以下几个角色:
UMl类图
二、有哪些应用场景
最常见的就是前后端实时通信的webscoket,观察者模式在其他实际应用中也具有广泛的应用场景,比如:
三、案例
我就以取快递这个案例为例,首先驿站拿到我们的快递后会给我们发送取件码,通知我们取件,然后我们接收到通知后,拿着取件码取件;这个过程中,驿站就是被观察者,我们自己就是观察者。接下来我们用代码实现这个过程。
首先,定义观察者接口或者抽象类
public abstract class Customer {
public abstract void update();
}
具体观察者
public class CustomerA extends Customer{
@Override
public void update() {
System.out.println("顾客A的快递已送达");
}
}
public class CustomerB extends Customer{
@Override
public void update() {
System.out.println("顾客B的快递已送达");
}
}
定义主题或目标接口
public interface Subject {
void registerCustomer(Customer o);
void removeCustomer(Customer o);
void notifyCustomers();
}
具体观察者
public class PostStation implements Subject{
private List<Customer> customerList ;
public PostStation(){
this.customerList = new ArrayList<>();
}
//添加顾客
@Override
public void registerCustomer(Customer o) {
customerList.add(o);
}
//删除顾客
@Override
public void removeCustomer(Customer o) {
customerList.remove(o);
}
//通知所有顾客
@Override
public void notifyCustomers() {
for (Customer customer : customerList){
customer.update();
}
}
//对外提供取快递方法
public void PostExpress(){
this.notifyCustomers();
}
}
测试
void test1(){
//创建一个驿站
PostStation postStation = new PostStation();
Customer customerA = new CustomerA();
Customer customerB = new CustomerB();
//添加两位顾客
postStation.registerCustomer(customerA);
postStation.registerCustomer(customerB);
//通知所以顾客取快递
postStation.notifyCustomers();
}