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

Java 观察者模式

作者: Yohann丶blog | 来源:发表于2020-09-07 14:47 被阅读0次
WechatIMG147.jpeg

介绍

shiyanlou:在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

角色

角色 说明
Subject 抽象目标类,一般至少提供三个接口:
添附(attach)
解附(detach)
通知(notify)
ConcreteSubject 具体目标,提供了观察者欲追踪的状态,也可设置目标状态
Observer 抽象观察者,定义观察者的更新操作接口
ConcreteObserver 具体观察者,实现抽象观察者的接口,做出自己的更新操作

角色示例

类名 担任角色 说明
OfficialAccount Subject 微信公众号,提供三个接口:
关注(follow)
取关(unFollow)
推送(send)
MyOfficialAccount ConcreteSubject 我的微信公众号
User Observer 用户
Developer ConcreteObserver 开发者

UML类图

观察者模式.png

代码

  • 创建 User.java,代码如下
abstract class User {
    abstract public String receive(OfficialAccount officialAccount);
    abstract public String getUsername();
}
  • 创建 Developer.java,代码如下
public class Developer extends User {
    protected String name;

    public Developer(String name){
        this.name = name;
    }

    @Override
    public String receive(OfficialAccount officialAccount) {
        return this.name+"接收到推送的文章:"+officialAccount.getArticle()+"\n";
    }

    @Override
    public String getUsername(){
        return this.name;
    }
}
  • 创建 OfficialAccount.java,代码如下
import java.util.ArrayList;

abstract class OfficialAccount {
    private ArrayList<User> userList;

    public OfficialAccount(){
        userList = new ArrayList<User>();
    }
    
    public String follow(User user) {
        userList.add(user);
        return user.getUsername()+" 关注了公众号";
    }

    public String unFollow(User user) {
        userList.remove(user);
        return user.getUsername()+" 取关了公众号";
    }

    public String send() {
        String sendLog = "";
        for (User user: userList) {
            sendLog += user.receive(this);
        }
        return sendLog;
    }

    abstract public void setArticle(String article);

    abstract public String getArticle();
}
  • 创建 MyOfficialAccount.java,代码如下
public class MyOfficialAccount extends OfficialAccount{

    private String article;

    public void setArticle(String article) {
        this.article = article;
    }

    public String getArticle() {
        return this.article;
    }
}
  • 创建 OfficialAccountTest.java,代码如下
public class OfficialAccountTest {
    public static void main(String[] args) {
        OfficialAccount myOfficialAccount = new MyOfficialAccount();

        User alan = new Developer("Alan");
        User bob = new Developer("Bob");
        
        System.out.println(myOfficialAccount.follow(alan));
        System.out.println(myOfficialAccount.follow(bob));

        myOfficialAccount.setArticle("《关于作者》");
        System.out.println(myOfficialAccount.send());
        
        myOfficialAccount.setArticle("《Java 观察者模式》");
        System.out.println(myOfficialAccount.unFollow(bob));
        System.out.println(myOfficialAccount.send());
    }
}

执行

$ javac OfficialAccountTest.java
$ java OfficialAccountTest
Alan 关注了公众号
Bob 关注了公众号
Alan 接收到推送的文章:《关于作者》
Bob 接收到推送的文章:《关于作者》
Bob 取关了公众号
Alan 接收到推送的文章:《设计模式 观察者模式》

相关文章

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • RxJava 2.x知识笔记

    观察者模式的运用 传统的Java观察者模式可以参考此篇博客:Java观察者模式案例简析 RxJava 是基于Jav...

  • java建造者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java单例模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java外观模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java适配器模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java观察者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java代理模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java策略模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • 六、JDK自带观察者

    利用Java提供的Observer接口和Observable类实现观察者模式 对于观察者模式,其实Java已经为我...

网友评论

    本文标题:Java 观察者模式

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