观察者,观察「主题」对象的变化;并更新。

        —— 我个人更愿意将观察者理解成 Subscription 订阅者,主题更新并通知订阅者,订阅者获得更新内容(content)。

看代码

主题接口

/**
 * 观察者 - 主题抽象类 : 拍卖品
 * @version 0.1
 * @author  BaiJing.biz
 */
public interface SubjectGoods {

    // 观察者对象
    void Subscribe(Observer observer);

    // 删除观察者对象
    void UnSubscribe(Observer observer);

    // 通知观察者更新消息
    void notify(int price);
}

主题对象


/**
 * 观察者 - 主题实现类 : 拍卖品
 * @version 0.1
 * @author  BaiJing.biz
 */
public class SubjectGoodsReal implements SubjectGoods{

    // 存储观察者对象 —— 多个
    private List<Observer> auctioneer = new ArrayList<Observer>();

    @Override
    public void Subscribe(Observer observer) {
        auctioneer.add(observer);
    }

    @Override
    public void UnSubscribe(Observer observer) {
        auctioneer.add(observer);
    }

    @Override
    public void notify(int price) {
        for (Observer observer : auctioneer) {
            // 拍卖品价格变化,更新给每一个拍卖者
            observer.update(price);
        }
    }
}

观察者接口

/**
 * 观察者 - 观察者抽象类 : 拍卖师
 * @version 0.1
 * @author  BaiJing.biz
 */
public interface Observer {

    void update(int price);
}

观察者对象

/**
 * 观察者 - 观察者实现类 : 拍卖师
 * @version 0.1
 * @author  BaiJing.biz
 */
public class Auctioneer implements Observer {

    private String name;
    public Auctioneer(String name) {
        this.name = name;
    }

    @Override
    public void update(int price) {
        System.out.println("Auctioneer " + this.name + " is now buying " + price);
    }
}

客户

public class CustomerRun {
    public static void main(String[] args) {

        SubjectGoodsReal goods  = new SubjectGoodsReal();

        goods.Subscribe(new Auctioneer("Tom"));
        goods.Subscribe(new Auctioneer("Tian"));
        goods.Subscribe(new Auctioneer("若水"));

        goods.notify(10);

    }
}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐