【設計模式】觀察者模式

觀察者模式


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