Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象
的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
需求场景:水果店顾客对老板说,下次来了阳光玫瑰,记得微信通知我。
那么这个场景,阳光玫瑰就是顾客订阅的对象(被观察者),顾客是观察者
两种实现,1.直接使用jdk自带的观察者设计模式 2.自定义观察者设计模式
上代码:
1.直接使用jdk自带的观察者设计模式
观察者Customer.java
package com.figo.study2024.pattern.observer.jdk;
import java.util.Observable;
import java.util.Observer;
/**
* 顾客作为观察者
*/
public class Customer implements Observer {
private String name;
public Customer(String name){
this.name = name;
}
/**
* 被通知方法
* @param o
* @param arg
*/
@Override
public void update(Observable o, Object arg) {
System.out.println(name + "购买阳光玫瑰");
}
}
被观察者RoseGrape.java
package com.figo.study2024.pattern.observer.jdk;
import java.util.Observable;
/**
* 水果店,阳光玫瑰葡萄,作为被观察者
*/
public class RoseGrape extends Observable {
private String name;
public RoseGrape(String name){
this.name = name;
}
//阳光玫瑰到货了
public void perform(){
this.setChanged();
this.notifyObservers();
}
}
客户端测试PatterTest .java
package com.figo.study2024.pattern.observer.jdk;
import com.figo.study2024.pattern.strategy.NewerDiscount;
import com.figo.study2024.pattern.strategy.ShoppingCart;
/**
* @ClassName:PatterTest
* @PackageName:com.figo.study2024.pattern.template
* @Description:客户端调用类描述
* @Date:2024/2/20 12:53
* @Author:figo
*/
public class PatterTest {
public static void main(String[] args) {
RoseGrape observable = new RoseGrape("阳光玫瑰");
//添加观察者
observable.addObserver(new Customer("andy"));
observable.addObserver(new Customer("james"));
observable.addObserver(new Customer("rose"));
observable.addObserver(new Customer("mary"));
//到货通知观察者
observable.perform();
}
}
2.自定义观察者设计模式
观察者接口Observer.java及实现类CustomerObserver.java
package com.figo.study2024.pattern.observer.custom;
/**
* @ClassName:Observer
* @PackageName:com.figo.study2024.pattern.observer.custom
* @Description:观察者接口
* @Date:2024/2/22 12:34
* @Author:figo
*/
public interface Observer {
void update();
}
package com.figo.study2024.pattern.observer.custom;
/**
* @ClassName:CustomerObserver
* @PackageName:com.figo.study2024.pattern.observer.custom
* @Description:类描述
* @Date:2024/2/22 12:36
* @Author:figo
*/
public class CustomerObserver implements Observer{
private String name;
public CustomerObserver(String name){
this.name = name;
}
@Override
public void update() {
System.out.println(name + "收到短信通知,来购买阳光玫瑰");
}
}
被观察者,主题,抽象类Subject.java及实现类RoseGrapeSubject.java
package com.figo.study2024.pattern.observer.custom;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName:Subject
* @PackageName:com.figo.study2024.pattern.observer.custom
* @Description:被观察者,主题
* @Date:2024/2/22 12:33
* @Author:figo
*/
public abstract class Subject {
//关注客户列表
protected List<Observer> observers = new ArrayList();
//关注顾客
public void add(Observer observer) {
observers.add(observer);
}
//取消关注
public void remove(Observer observer) {
observers.remove(observer);
}
//发通知
public abstract void notifyObservers();
}
package com.figo.study2024.pattern.observer.custom;
/**
* @ClassName:RoseGrapeSubject
* @PackageName:com.figo.study2024.pattern.observer.custom
* @Description:类描述
* @Date:2024/2/22 12:38
* @Author:figo
*/
public class RoseGrapeSubject extends Subject{
@Override
public void notifyObservers() {
//遍历观察者集合,调用每一个顾客的购买方法
for(Observer obs : observers) {
obs.update();
}
}
public void roseGrapeHasArrived()
{
System.out.println("阳光玫瑰到货了,通知客户来购买");
notifyObservers();
}
}
客户端测试PatterTest.java
package com.figo.study2024.pattern.observer.custom;
import com.figo.study2024.pattern.strategy.NewerDiscount;
import com.figo.study2024.pattern.strategy.ShoppingCart;
/**
* @ClassName:PatterTest
* @PackageName:com.figo.study2024.pattern.template
* @Description:客户端调用类描述
* @Date:2024/2/20 12:53
* @Author:figo
*/
public class PatterTest {
public static void main(String[] args) {
RoseGrapeSubject roseGrapeSubject = new RoseGrapeSubject();//被观察目标,主题
//添加观察者
roseGrapeSubject.add(new CustomerObserver("andy"));
roseGrapeSubject.add(new CustomerObserver("james"));
roseGrapeSubject.add(new CustomerObserver("rose"));
roseGrapeSubject.add(new CustomerObserver("mary"));
//阳光玫瑰到货,短信或者微信通知客户来购买
roseGrapeSubject.roseGrapeHasArrived();
}
}
可以看到观察者模式,其实是观察者订阅了主题(即被观察者),被观察者有更新时,则调用观察者的回调方法,让观察者能够得到通知,做出回应。