Java设计模式-观察者模式。

2018-07-30  本文已影响0人  怪咖大蜀

今天给大家带来一个同样比较简单的设计模式,观察者模式,首先我们来看一下定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
根据这个定义,我们可以看出,主要分为两个部分,第一个是观察者,第二个是被观察者。为一对多的关系,当被观察者做出改变的时候,观察者们可以观察到这个变化。比较容易理解的例子就是我们的公众号,公众号就是被观察者,用户就是观察者,当公众号发表文章的时候,我们每个关注了的用户都能立即收到。我们进行分析,公众号主要有三个功能,分别为,关注、取消关注、推送消息。用户只有在关注了之后,才能在公众号做消息推送的时候进行接收。我们来书写一下这个被观察者的超类。

//被观察者
public interface Observerable<T>{
    //订阅
     public  void subscribe(Observer<T> observer);
     //取消订阅
     public  void unSubscribe(Observer<T> observable);
     //告知观察者数据改变
     public  void notifyObserver(T t);
}

我们的用户比较简单提供一个方法来让公众号告知改变了什么数据。我们来书写一下超类。

//观察者
public interface  Observer<T> {
    public void updata(T data);
}

接下来我们来进行具体的实现

public class WeChatServer<T> implements Observerable<T> {
    public List<Observer<T>> observers  ;

    public WeChatServer(){
        observers = new ArrayList<>();
    }
    @Override
    public void subscribe(Observer<T> observer) {
        if(observer!= null && !observers.contains(observer)){
            observers.add(observer);
        }else if(observer == null){
            throw new IllegalArgumentException("observer is null");
        }
    }

    @Override
    public void unSubscribe(Observer<T> Observer) {
        if(!observers.isEmpty()){
            observers.remove(Observer);
        }
    }

    @Override
    public void notifyObserver(T t) {
        for(int i = 0; i < observers.size(); i++) {
            Observer oserver = observers.get(i);
            oserver.updata(t);
        }
    }
    //设置数据
    public void setData(T data){
        notifyObserver(data);
    }
}

被观察者提供subscribe方法将观察者放在一个统一的集合当中,主要目的就是在数据改变时,找到所有关注了的用户,告知数据发生了改变。我们可以在notifyObserver方法中看到具体实现。setData方法提供的是改变公众号内容的方法。我们再来实现一下用户部分。

public class User implements Observer<String> {
    private String name;
    private int age;
    public User(String name, int age){
        this.name = name;
        this.age = age ;
    }

    @Override
    public void updata(String data) {
        System.out.println("我是"+name+",我收到了消息data:="+data);
    }
}

我们实现updata方法接收到公众号的更新。并打印更新信息,我们来测试一下。

    public static void main(String args[]){
        WeChatServer<String> observerable = new WeChatServer<>();

        Observer<String> observer1  = new User("張三",18);
        Observer<String> observer2  = new User("李四",31);
        Observer<String> observer3  = new User("王武",11);
        Observer<String> observer4 = new User("玉刚",30);
        observerable.subscribe(observer1);
        observerable.subscribe(observer2);
        observerable.subscribe(observer3);
        observerable.subscribe(observer4);
        observerable.setData("新闻1");
        observerable.unSubscribe(observer2);
        System.out.println("李四退订");
        observerable.setData("新闻2");
    }
//结果
我是張三,我收到了消息data:=新闻1
我是李四,我收到了消息data:=新闻1
我是王武,我收到了消息data:=新闻1
我是玉刚,我收到了消息data:=新闻1
李四退订
我是張三,我收到了消息data:=新闻2
我是王武,我收到了消息data:=新闻2
我是玉刚,我收到了消息data:=新闻2

我们可以看到 我们创建了4个用户分别订阅了公众号。都能收到公众号的新闻,当李四退订之后,公众号发的新闻就收不到了。完全符合对观察者模式的定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

上一篇下一篇

猜你喜欢

热点阅读