java订阅模式_java 观察这模式(发布订阅模式)

观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。

具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

java实现:

抽象被观察者(抽象主题):Observable.java

抽象被观察者的具体实现(主题服务):ObservableImpl.java

抽象观察者(用户(订阅者)的抽象):Observer.java

抽象观察者的具体实现(用户(订阅者)具体实现):User.java

Observable.java(被订阅服务的实现)

/**

* @ClassName Observerable 被观察者(被订阅的对象抽象)

* @Description TODO

* @author jxd

* @Date 2018年9月11日 上午10:15:33

* @version 1.0.0

*/

public interface Observable {

//注册用户

public void registerUser(Observer observer);

//移除用户

public void removeUser(Observer observer);

//通知观察者

public void notifyObserver();

}

ObservableImpl.java(被订阅服务的实现)

/**

* @ClassName ObservableImpl 抽象被观察者(主题服务)的具体实现

* @Description TODO

* @author jxd

* @Date 2018年9月11日 下午1:58:42

* @version 1.0.0

*/

public class ObservableImpl implements Observable {

private List userList = new ArrayList<>();;

private String message;

@Override

public void registerUser(Observer observer) {

// TODO Auto-generated method stub

userList.add(observer);

}

@Override

public void removeUser(Observer observer) {

// TODO Auto-generated method stub

if (observer != null && userList != null && userList.size() > 0) {

userList.remove(observer);

}

}

@Override

public void notifyObserver() {

// TODO Auto-generated method stub

userList.forEach(x -> {

x.getTopicNotification(message);

});

}

public void setInformation(String str){

this.message=str;

notifyObserver();

}

}

Observer.java(订阅者的抽象)

/**

* @ClassName Observer 抽象观察者(需要订阅主题的用户)

* @Description TODO

* @author jxd

* @Date 2018年9月11日 上午10:16:49

* @version 1.0.0

*/

public interface Observer {

/**

* @Description (得到主题(订阅对象)返回的通知)

* @param message

*/

public void getTopicNotification(String message);

}

User.java(订阅对象的实现)

public class User implements Observer {

private String name;

private String message;

public User(String name) {

this.name = name;

}

@Override

public void getTopicNotification(String message) {

// TODO Auto-generated method stub

this.message = message;

read();

}

public void read() {

System.out.println(name + ":" + "收到消息内为:" + message);

}

}

测试。。。。。。。。。。

public static void main(String[] args) {

Observer z=new User("jinxudong");

Observer s = new User("jinxudong1");

Observer e = new User("jinxudong2");

ObservableImpl wechatServer=new ObservableImpl();

wechatServer.registerUser(s);

wechatServer.registerUser(z);

wechatServer.registerUser(e);

wechatServer.setInformation("发布第一次消息...");

System.out.println("-------------------测试取消关注 -------");

wechatServer.removeUser(z);

wechatServer.setInformation("发布第二次消息...");

}

测试结果:

jinxudong1:收到消息内为:发布第一次消息...

jinxudong:收到消息内为:发布第一次消息...

jinxudong2:收到消息内为:发布第一次消息...

-------------------测试取消关注 -------

jinxudong1:收到消息内为:发布第二次消息...

jinxudong2:收到消息内为:发布第二次消息...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值