Java 观察者模式

WechatIMG147.jpeg

介绍

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

角色

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

角色示例

类名担任角色说明
OfficialAccountSubject微信公众号,提供三个接口:
关注(follow)
取关(unFollow)
推送(send)
MyOfficialAccountConcreteSubject我的微信公众号
UserObserver用户
DeveloperConcreteObserver开发者

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 接收到推送的文章:《设计模式 观察者模式》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值