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("小米手機"); /*輸出結果 蘋果手機到貨了,現特來告知親--蘋果粉絲 蘋果手機到貨了,現特來告知親--小米粉絲 小米手機到貨了,現特來告知親--小米粉絲 */ } }