发布者订阅者模式(一)

自己画了个图


demo是用了两个场景来描述的,一个是找工作(查的资料),一个是购物,仿照写的,为了加深理解,根据名字可以知道订阅者和发布者,然后实体类分别取实现这两个接口类,来看订阅者

package com.fanyafeng.obser;

/**
 * Created by fanyafeng on 16/6/27.
 */
public interface Observer {
    public void update(Subject subject);
}

发布者:

package com.fanyafeng.obser;

/**
 * Created by fanyafeng on 16/6/27.
 */
public interface Subject {
    public void registerObserver(Observer observer);

    public void removeObserver(Observer observer);

    public void notifyAllObservers();
}
这个真的可以类比一下网络购物,可以把一间店铺类比为发布者,然后消费者首先需要收藏可以类比订阅才能收到店铺的消息,如果店铺发消息的话肯定所有收藏店铺的都可以收到推送,在这也可以体会一下谁的业务比较复杂,来看具体实现

shop

package com.fanyafeng.obser.shopping;

import com.fanyafeng.obser.Observer;
import com.fanyafeng.obser.Subject;

import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;

/**
 * Created by fanyafeng on 16/6/28.
 */
public class Shop implements Subject {
    private ArrayList<Observer> customerList;
    private ArrayList<String> messages;

    public Shop() {
        customerList = new ArrayList<>();
        messages = new ArrayList<>();
    }

    //订阅消息
    @Override
    public void registerObserver(Observer observer) {
        customerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {

    }

    @Override
    public void notifyAllObservers() {//发布者,通知所有订阅者
        for (Observer observer : customerList) {
            observer.update(this);
        }
    }

    //店铺广播消息
    public void postMessage(String message) {
        this.messages.add(message);
        notifyAllObservers();
    }

    public ArrayList<String> getMessages() {
        return messages;
    }

    //店铺消息
    public String toString() {
        return messages.toString();
    }
}
customer

package com.fanyafeng.obser.shopping;

import com.fanyafeng.obser.Observer;
import com.fanyafeng.obser.Subject;

/**
 * Created by fanyafeng on 16/6/28.
 */
public class Customer implements Observer {

    private String customer;

    public Customer(String customer) {
        this.customer= customer;
    }

    @Override
    public void update(Subject subject) {//订阅者
        System.out.println("收到店铺消息的消费者:" + this.customer);
        System.out.println("店铺消息:" + subject.toString());
    }
}


Shop shop = new Shop();
        shop.registerObserver(new Customer("小红"));
        shop.registerObserver(new Customer("小芳"));
        shop.registerObserver(new Customer("广大女生"));

        shop.postMessage("鞋子降价了");
        shop.postMessage("零食降价了");
这样就ok了








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值