java设计模式-观察者模式

hl.wang

发布于 2019.09.21 09:54 阅读 2536 评论 0

观察者模式

       当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

 

 

什么情况下可以使用观察者模式?

一个目标对象发生改变时所有依赖他的对象都需要发生改变或者进行通知的时候

 

 

如何使用观察者模式?

 

首先是观察者抽象接口

public interface Observer {
    void update(String message);
}

 

然后是具体的观察者

public class User implements Observer{
    private String name;
    private String message;
    @Override
    public void update(String message) {
        this.message = message;
        read();
    }
    public User(String name){
        this.name = name;
    }
    public void read(){
        System.out.println(name+"接收到了推送消息:"+message);
    }
}

 

接下来建立被观察者接口

public interface Observerable {
    //注册一个观察者
    void registerObserver(Observer o);
    //移除一个观察者
    void removeObserver(Observer o);
    //通知所有观察者
    void notifyObserver();
}

 

然后是具体实现

public class WechatServer implements Observerable {
    List<Observer> observerList ;
    private String message;
    public WechatServer(){
        observerList = new ArrayList<Observer>();
    }
    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);
    }
    @Override
    public void removeObserver(Observer o) {
        if(!observerList.isEmpty()){
            observerList.remove(o);
        }
    }
    @Override
    public void notifyObserver() {
        for(int i = 0; i<observerList.size();i++){
            Observer observer = observerList.get(i);
            observer.update(message);
        }
    }
    public void setInformation(String message){
        this.message = message;
        System.out.println("微信服务更新消息:"+message);
        notifyObserver();
    }
}

 

 

代码写好了我们就来测试一下吧

public class Demo {
    public static void main(String[] args) {
        WechatServer wechatServer = new WechatServer();
        Observer userZhang = new User("张三");
        Observer userWang = new User("王五");
        wechatServer.registerObserver(userWang);
        wechatServer.registerObserver(userZhang);
        wechatServer.setInformation("PHP世界上最好的语言");
        System.out.println("================张三取消订阅==========================");
        wechatServer.removeObserver(userZhang);
        wechatServer.setInformation("JAVA世界上最好的语言");
    }
}

 

 

 

 

 

总结

观察者模式优点:

1、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。

2、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。

 

观察者模式的缺点:

1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。

3、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。

4、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。