【设计模式】- 观察者模式

一、什么是观察者模式

观察者模式体现了一对多的对象关系,即主题(一)和观察者(多),当主题发生改变时,会通知每一个观察者,主题负责消息的发送,观察者默默的接收消息。观察者和主题是松耦合的,移除任何一个观察者都不会对主题产生影响。java.uitl.Observer(观察者)和 Observable(主题)实现了此模式。每一个观察者即可以是观察者也可以是主题,主题也是如此,这要看它都实现了那些接口。

二、观察者模式解决了什么问题

观察者模式解决了对象之间紧耦合的问题,观察者模式使我们可以进一步的解耦合。

三、观察者模式思图

来自《headfirst设计模式》
在这里插入图片描述

四、观察者模式使用示例

区分观察者和主题的办法是主题实现了主题接口

定义主题接口

package 设计模式.观察者模式;
/*
   创建一个主题,
*/
public interface Theme {

    /*定义添加观察者的方法*/
   void addObserver(Observer observer);
    /*定义移除观察者的方法*/
    void deleteObserver(Observer observer);
    /*定义通知观察者的方法*/
    void noticeObserver();
    /*定义观察者主动获取数据的方法*/
    Object getData();

}

实现一个主题

package 设计模式.观察者模式;


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

public class Newspaper implements Theme {

    /*观察者们在这里...*/
    private List<Observer> observers;
    /*模拟的数据*/
    private String data = "有内鬼,终止交...";

    /*默认使用ArrayList存储*/
    public Newspaper(){
        this.observers = new ArrayList<>();
    }
    /*也可以指定*/
    public Newspaper(List list){
        this.observers = list;
    }


    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void deleteObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void noticeObserver() {
        for (Observer observer : observers){
            observer.receiveData(data);
        }
    }

    @Override
    public Object getData() {
        return data;
    }
}

区分观察者和主题的办法是观察者实现了观察者接口

定义观察者接口

package 设计模式.观察者模式;


/*观察者接口*/
public interface Observer {

    /*申请成为观察者*/
    void becomeObserver();

    /*接收主题发送来的数据*/
    void receiveData(Object o);

    /*将自己从主题中移除*/
    void removeYourself();

    /*主动获取主题中的数据*/
    void getData();

    /*展示数据*/
    void showData();
}

实现一个观察者

package 设计模式.观察者模式;


public class subscriber implements Observer {

    /*指定观察者*/
    private Theme theme;
    /*模拟接收到的数据*/
    private Object data;

    public subscriber(Theme theme){
        this.theme=theme;
    }

    @Override
    public void becomeObserver() {
        theme.addObserver(this);
    }

    @Override
    public void receiveData(Object o) {
        this.data=o;
    }

    @Override
    public void removeYourself() {
        theme.deleteObserver(this);
    }

    @Override
    public void getData() {
        this.data = theme.getData();
        showData();
    }

    @Override
    public void showData() {
        System.out.println("我是观察者一号,我接收到的消息:"+data);
    }
}

五、观察者模式的设计原则

为对象之间的松耦合设计而努力

六、关键词

一对多 订阅 取消订阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值