观察者模式-简shu,你欠我们一个朋友圈

1 介绍


Observe模式是行为模式的一种。主要是用来监听对象的变化,当一个对象的状态发生改变时,会自动的通知其它的关联对象。使得该对象和关联对象保持一致。

观察者模式-简shu,你欠我们一个朋友圈_第1张图片

闲扯
不知道各位简友有没有发现是不是缺少一个朋友圈的功能,当好友发表一篇后,其它好友会收到通知并可以在朋友圈中进行查看、评论。但目前来说,虽然说是有个简友圈,但是主要是来告诉好友自己关注了谁,评论了哪篇文章等。并没有像朋友圈那样强大。不过也许设计的初衷就是这样的/(ㄒoㄒ)/~~

但是,作为一个程序猴来说,创造是我们的本能。所以我们要来实现这个功能,使用观察者模式实现发送后的通知功能。

2 实现


观察者模式的几个角色

  • Subject(被观察者):被观察的对象,当被观察对象的状态发生改变时,会通知队列中所有的观察者。(当一篇新的发布时,通知其它好友)

  • ConcreteSubject:被观察者的具体实现,其中包含常见的属性和操作。(一篇自带的属性:标题、内容等...)

  • Observe(观察者):抽象类或接口,当被观察者的状态发生变化时,观察者对象会通过一个callback函数得到通知。

  • ConcreteObserve:观察者的具体实现,得到通知后完成具体的逻辑实现。(当发了一篇新的后以怎样的形式去通知给简友)

观察者模式-简shu,你欠我们一个朋友圈_第2张图片

具体实现

被观察者:User.class


public class User extends Observable{
    public void publishArticle(Article article){
        System.out.println("我发表文章:标题:"+
              article.getTitle() + ",内容为:" + article.getContent());
//      设置被观察者的状态被改变
        this.setChanged();
//      通知队列中的其它观察者,并将改变的内容一并发送过去
        this.notifyObservers(article);
    }
}

ConcreteSubject:Article.class

public class Article {
    private String title;
    private String content;
    
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

ConcreteObserve:MyObserve.class

//需要实现Observer接口并实现响应的方法
public class MyObserve implements Observer{

//  callBack函数,当被观察者状态发生改变时调用
    @Override
    public void update(Observable o, Object arg) {  
        //接收传过来的对象
        Article article = (Article)arg;
        //通知其它简友的形式
        System.out.println("----------------------------------");
        System.out.println("有简友发布新文章:标题为:" + article.getTitle());
    }
}

测试: MainClass.class

public class MianClass {
    public static void main(String[] args) {
        Article article = new Article();
        article.setTitle("初来乍到");
        article.setContent("第一篇");
        User user = new User();
        //为用户注册一个观察者
        user.addObserver(new MyObserve());
        //用户发表,(即被观察者状态发生改变)
        user.publishArticle(article);
    }
}
观察者模式-简shu,你欠我们一个朋友圈_第3张图片
运行结果

这样一来,一个简单的通知功能就完成了,当然一个被观察者可以注册多个观察者,一个观察者也是可以被多个被观察者所注册。

3 应用场景


  • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当改变一个对象的同时需要改变其它对象, 而不知道具体有多少对象有待改变时。

喜欢的话戳一下喜欢呗。
有什么建议的话希望大家能在下方回复(●'◡'●)
上一篇:策略模式
下一篇:享元模式

你可能感兴趣的:(观察者模式-简shu,你欠我们一个朋友圈)