观察者模式
2019-11-10 18:11:40 by冲冲
1、概念
多个观察者(继承同一个抽象类)只需要注册到被观察者的通知名单,被观察者如果发生改变,则会主动通知观察者。
观察者继承同一个抽象类,该抽象类定义一个反应方法,用来定义当被观察者发生改变时不同观察者的行为。同时该抽象类在构造时将被观察者注册为属性成员。
被观察者有一个通知名单(属性成员),每个观察者要主动注册到该名单,当被观察者发生改变,会调用名单上面所有观察者对象的反应方法。
观察者模式,亦称发布-订阅模式。
2、完整代码
import java.util.ArrayList;
import java.util.List;
class Shop {
private String product;
private List<Buyer> buyers;// 持有买家的引用,即通知名单
public Shop() {
this.product = "无商品";
this.buyers = new ArrayList<>();
}
// 为了主动通知买家,买家得来店里注册。
public void register(Buyer buyer) {
this.buyers.add(buyer);
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;// 到货了
notifyBuyers();// 到货后通知买家
}
// 通知所有注册买家
public void notifyBuyers() {
buyers.stream().forEach(b -> b.inform());
}
}
abstract class Buyer {
protected String name;
protected Shop shop;
public Buyer(String name, Shop shop) {
this.name = name;
this.shop = shop;
}
public abstract void inform();
}
class IPhoneFans extends Buyer {
public IPhoneFans(String name, Shop shop) {
super(name, shop);//调用父类进行构造
}
@Override
public void inform() {
String product = shop.getProduct();
if(product.contains("苹果手机")){//此买家只买苹果手机
System.out.println(product + "到货了,现特来告知亲--" + name);
}
}
}
class AllPhoneFans extends Buyer {
public AllPhoneFans(String name, Shop shop) {
super(name, shop);
}
@Override
public void inform() {
String product = shop.getProduct();
System.out.println(product + "到货了,现特来告知亲--" + name);
}
}
public class Observer {
public static void main(String[] args) {
Shop shop = new Shop();
Buyer tanSir = new IPhoneFans("苹果粉丝", shop);
Buyer barJeet = new AllPhoneFans("小米粉丝", shop);
shop.register(tanSir);
shop.register(barJeet);
//商店到货
shop.setProduct("苹果手机");
shop.setProduct("小米手机");
/*输出结果
苹果手机到货了,现特来告知亲--苹果粉丝
苹果手机到货了,现特来告知亲--小米粉丝
小米手机到货了,现特来告知亲--小米粉丝
*/
}
}