HeadFirst笔记02:观察者(observer)模式

观察者模式是什么?

简单来说观察者模式就是订阅思想,

举例:订牛奶

我们订了牛奶,我们就是观察者了,然后牛奶公司会推送(发送)牛奶过来。

观察者的好处在于:

1.不需要自己去获取(比如牛奶公司来送牛奶) 

 2.删除观察者身份时很便捷(比如通知牛奶公司取消订牛奶即可),也就是主题和观察者之间松耦合(高内聚低耦合)

所以书中的这句话就能看懂了:

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
 
 

具体事例代码(订牛奶)

接口代码:

//主题(牛奶订阅中心)
public interface Subject {
    //注册观察者
    public void registerObserver(ObserverEntity o);
    //移除观察者
    public void removeObserver(ObserverEntity o);
    //通知全体观察者
    public void notifyObservers();
    //通知单个观察者
    public void notifyObserver(ObserverEntity o);
}
public interface Observer {
    //这里更新观察者订阅信息(牛奶订阅信息)
    public void update(String name,String address,String msg);
}

class代码:

1.具体订阅者

public class ObserverEntity implements Observer{
    //订阅者名称
    private String name;
    //订阅者地址
    private String address;

    public ObserverEntity(String name, String address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }



    @Override
    public void update(String name, String address, String msg) {
        System.out.println("姓名:"+name+",地址:"+address+",消息:"+msg);
    }
}

2.牛奶公司

//牛奶公司实现订阅中心的方法
public class milkCompany implements Subject {
    //订阅者列表
    private ArrayList observers;
    //订阅者消息
    private String msg;

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public milkCompany() {
        //创建观察者列表
        observers=new ArrayList();
    }

    @Override
    public void registerObserver(ObserverEntity o) {
        //添加订阅者(观察者)到列表
        observers.add(o);
    }

    @Override
    public void removeObserver(ObserverEntity o) {
        //判断订阅者(观察者)是否在列表中,在则删去
        int i = observers.indexOf(o);
        if(i>=0) {
            observers.remove(i);
        }
    }

    @Override
    public void notifyObservers() {
        for (int i = 0; i < observers.size(); i++) {
            ObserverEntity observer = (ObserverEntity)observers.get(i);
            observer.update(observer.getName(), observer.getAddress(),msg);
        }
    }

    @Override
    public void notifyObserver(ObserverEntity o) {
        o.update(o.getName(), o.getAddress(),msg);
    }
}

 

3.具体的测试代码

public class Test {
    public static void main(String[] args) {
        //有一个牛奶公司
        milkCompany company=new milkCompany();
        //这里有2个意向订阅者(沙丁鱼和鲨鱼)
        ObserverEntity sardine=new ObserverEntity("沙丁鱼","沙丁鱼星球");
        ObserverEntity shark=new ObserverEntity("鲨鱼","海洋");
        //牛奶公司将两位意向者注册进自己的列表
        company.registerObserver(sardine);
        company.registerObserver(shark);
        //牛奶公司先宣布一条重大消息
        company.setMsg("客户们,牛奶涨价啦!!");
        company.notifyObservers();
        //鲨鱼取消订阅了
        company.removeObserver(shark);
        //牛奶公司运送牛奶给沙丁鱼
        company.setMsg("沙丁鱼,你的牛奶已到");
        company.notifyObserver(sardine);
    }
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值