2019-11-10 18:11:40 by冲冲java
多个观察者(继承同一个抽象类)只须要注册到被观察者的通知名单,被观察者若是发生改变,则会主动通知观察者。ide
观察者继承同一个抽象类,该抽象类定义一个反应方法,用来定义当被观察者发生改变时不一样观察者的行为。同时该抽象类在构造时将被观察者注册为属性成员。this
被观察者有一个通知名单(属性成员),每一个观察者要主动注册到该名单,当被观察者发生改变,会调用名单上面全部观察者对象的反应方法。spa
观察者模式,亦称发布-订阅模式。code
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("小米手机"); /*输出结果 苹果手机到货了,现特来告知亲--苹果粉丝 苹果手机到货了,现特来告知亲--小米粉丝 小米手机到货了,现特来告知亲--小米粉丝 */ } }