CRUD很无聊?一起学设计模式吧!— 观察者模式

Kafka进阶篇知识点

image

Kafka高级篇知识点

image

44个Kafka知识点(基础+进阶+高级)解析如下

image

由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public class Fans implements Observer {

private String name;

public Fans(String name) {

this.name = name;

}

@Override

public void recive(String message) {

System.out.println("粉丝 " + this.name + " 收到消息: "+message);

}

}

抽象主题(抽象被观察者)

抽象主题主要是定义一些接口用于管理观察者,公众号有权利来管理所有的粉丝并在发布消息后通知所有的粉丝。

/**

  • Subject

  • Description:

  • 定义抽象主题,主题需要实现添加、删除、通知观察者

  • @author jam

  • @date 2019/4/19下午11:20

*/

public interface Subject {

/**

  • 注册成为观察者

  • @param observer

*/

public void attach(Observer observer);

/**

  • 删除观察者

  • @param observer

*/

public void detach(Observer observer);

/**

  • 通知所有观察者

*/

public void notifyObservers();

}

具体主题(具体被观察者)

具体主题除了必须要实现抽象主题定义的方法外,还需要有个额外的方法change(),当主题发生变化时才会告诉观察者。在本场景中公众号发布消息,我们使用publish(String message)方法替代change()方法。

/**

  • WechatServer

  • Description:

  • 具体主题

  • @author jam

  • @date 2019/4/19下午11:24

*/

public class WechatServer implements Subject {

private ArrayList observers;

private String message;

public WechatServer() {

observers = new ArrayList<>();

}

/**

  • 让一个用户注册成为观察者即粉丝

  • @param observer

*/

@Override

public void attach(Observer observer) {

observers.add(observer);

}

/**

  • 不喜欢这个观察者,删除掉

  • @param observer

*/

@Override

public void detach(Observer observer) {

observers.remove(observer);

}

/**

  • 通知所有的观察者

*/

@Override

public void notifyObservers() {

for (Observer observer : observers) {

observer.recive(message);

}

}

/**

  • 当主题发生变化时通知观察者

  • @param message

*/

public void publish(String message){

this.message = message;

System.out.println(“webchat publish message:” + message);

notifyObservers();

}

}

测试类

public class Test {

public static void main(String[] args) {

WechatServer wechatServer = new WechatServer();

Fans fans1 = new Fans(“张三”);

Fans fans2 = new Fans(“李四”);

Fans fans3 = new Fans(“杨五”);

wechatServer.attach(fans1);

wechatServer.attach(fans2);

wechatServer.attach(fans3);

wechatServer.publish(“CRUD很无聊?跟我一起学命令模式吧!”);

System.out.println(“--------”);

//删除其中一个粉丝

wechatServer.detach(fans1);

wechatServer.publish(“CRUD很无聊?跟我一起学观察者模式吧!”);

}

}

执行结果

image.png

通过执行结果我们可以发现,在公众号发布消息后所有的粉丝都可以收到消息,而取消关注或者被剔除粉丝队伍以后就收不到消息了。

推模式与拉模式


我们上面的场景是观察者模式中的推模式,这种场景是主题主动向观察者推送数据,不管观察者需要不需要。推模式的前提是主题对象知道观察者需要的数据,观察中的update()方法里的参数是按照需要定义的方法,但是随着业务的发展会出现考虑不到的情形。

比如我们上述场景中粉丝只需要知道公众号发布的内容,所以我们先约定String类型的参数,但是有些粉丝却想知道这个消息的真实作者是谁(是否转载?),这个时候就需要提供新的方法,比如update(String message,String author),或者干脆重新实现观察者,不管如何都得作相应的改动。

观察者模式还有另外一个模式拉模式,这个模式不需要知道观察者需要什么数据,他把主题自身都传递给观察者,update(Subject subject),然后对外提供一些getter方法,让观察者按需来取,这样基本上可以适用各种情况的需要。

接下来我们用拉模式来实现上面的场景。

抽象观察者

这里我们不再适用约定参数处理recive方法,而是使用主题直接作为参数。

public interface Observer {

/**

  • 使用主题作为参数

  • @param subject

*/

public void recive(Subject subject);

}

具体观察者

收到通知后,我们按需从主题对象中获取相应的数据。

public class Fans implements Observer {

private String name;

public Fans(String name) {

this.name = name;

}

@Override

public void recive(Subject subject) {

//观察者可以同时观察多个主题

//所以我们需要确保被观察者属于我们需要的WechatServer类型

//如果是其他类型可能需要作其他方式处理

if(subject instanceof WechatServer){

WechatServer wechatServer = (WechatServer) subject;

System.out.println("粉丝 " + this.name + " 收到消息: "

  • wechatServer.getMessage() + " 作者是:"

  • wechatServer.getAuthor());

}

}

}

抽象主题

未发生变化

public interface Subject {

/**

  • 注册成为观察者

  • @param observer

*/

public void attach(Observer observer);

/**

  • 删除观察者

  • @param observer

*/

public void detach(Observer observer);

/**

  • 通知所有观察者

*/

public void notifyObservers();

}

具体主题

重点关注notifyObservers()方法,直接将this即当前主题作为参数传递给观察者,并对外提供getMessage()getAuthor()方法,好让观察者对象可以方便取走想要的数据。

public class WechatServer implements Subject {

private ArrayList observers;

private String message;

private String author;

/**

  • 对外提供获取内容的方法

  • @return

*/

public String getMessage() {

return message;

}

/**

  • 对外提供获取作者的方法

  • @return

*/

public String getAuthor() {

return author;

}

public WechatServer() {

observers = new ArrayList<>();

}

/**

  • 让一个用户注册成为观察者即粉丝

  • @param observer

*/

@Override

public void attach(Observer observer) {

observers.add(observer);

}

/**

  • 不喜欢这个观察者,删除掉

  • @param observer

*/

@Override

public void detach(Observer observer) {

observers.remove(observer);

}

/**

  • 通知所有的观察者

*/

@Override

public void notifyObservers() {

for (Observer observer : observers) {

//这里不再是具体的参数,而是把主题自身给通知给观察者

observer.recive(this);

}

}

/**

  • 当主题发生变化时通知观察者

  • @param message

最后

由于篇幅限制,小编在此截出几张知识讲解的图解

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

rvers() {

for (Observer observer : observers) {

//这里不再是具体的参数,而是把主题自身给通知给观察者

observer.recive(this);

}

}

/**

  • 当主题发生变化时通知观察者

  • @param message

最后

由于篇幅限制,小编在此截出几张知识讲解的图解

[外链图片转存中…(img-LbZTnXdi-1715824138270)]

[外链图片转存中…(img-fSCgX2o9-1715824138271)]

[外链图片转存中…(img-Um9iuuXY-1715824138271)]

[外链图片转存中…(img-tArN2dGB-1715824138272)]

[外链图片转存中…(img-HTDL2RpF-1715824138272)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值