简介
观察者模式是行为型的一种,主要应用在对象存在一对多且存在依赖的场景。在观察者模式中,有观察者何被管擦在两种对象,当被观察者发生变化时,会自动通知其关心的观察者。在日常生活中,观察者也很常见,比如苹果新发布了一款手机,但没有现货,京东上会有个到货通知,若你点击了,当有现货时,你就会收到通知。接下来就以手机的到货通知为例写实现Demo:
Demo示例
1.首先定义消费者接口,其角色是观察者,然后一个NormalComsumer和Huangniu实现它:
public interface Consumer {
void buy();
void handle(Object msg);
}
public class NormalConsumer implements Consumer{
private String name;
public NormalConsumer(String name) {
this.name = name;
}
public NormalConsumer(){}
public void buy() {
System.out.println("I pay for this phone.");
}
@Override
public void handle(Object msg) {
System.out.println(name + " received msg " + msg + ", I will buy");
buy();
}
}
public class Huangniu implements Consumer{
private String name;
public Huangniu(String name) {
this.name = name;
}
public Huangniu(){}
public void buy() {
System.out.println("I pay for this phone.");
}
@Override
public void handle(Object msg) {
System.out.println(name + " received msg " + msg + ", I will buy");
buy();
}
}
2.定义手机类,其角色是被观察者:
import java.util.ArrayList;
import java.util.List;
public class Phone {
private List<Consumer> follows = new ArrayList<>();
public void addFollow(Consumer consumer) {
follows.add(consumer);
}
public void removeConsumer(Consumer consumer) {
follows.remove(consumer);
}
public void notify(Object msg) {
for (Consumer follow : follows) {
follow.handle(msg);
}
}
}
3.客户端调用:
public class Test {
public static void main(String[] args) {
Consumer mike = new NormalConsumer("mike");
Consumer james = new Huangniu("james");
Phone phone = new Phone();
phone.addFollow(mike);
phone.addFollow(james);
phone.notify("Iphone15 Pro sale");
/**
* mike received msg Iphone15 Pro sale, I will buy
* I pay for this phone.
* james received msg Iphone15 Pro sale, I will buy
* I pay for this phone.
*/
}
}