美文网首页
Java设计模式-观察者模式。

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

作者: 怪咖大蜀 | 来源:发表于2018-07-30 16:08 被阅读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个用户分别订阅了公众号。都能收到公众号的新闻,当李四退订之后,公众号发的新闻就收不到了。完全符合对观察者模式的定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

    相关文章

      网友评论

          本文标题:Java设计模式-观察者模式。

          本文链接:https://www.haomeiwen.com/subject/cjuwmftx.html