【设计模式】观察者模式

观察者模式


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("小米手机");
        /*输出结果
          苹果手机到货了,现特来告知亲--苹果粉丝
          苹果手机到货了,现特来告知亲--小米粉丝
          小米手机到货了,现特来告知亲--小米粉丝
        */
    }
}

 

 

 

 

posted @ 2019-11-10 19:23  Yadielr  阅读(178)  评论(0编辑  收藏  举报