Kafka进阶篇知识点
Kafka高级篇知识点
44个Kafka知识点(基础+进阶+高级)解析如下
由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**
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很无聊?跟我一起学观察者模式吧!”);
}
}
执行结果
通过执行结果我们可以发现,在公众号发布消息后所有的粉丝都可以收到消息,而取消关注或者被剔除粉丝队伍以后就收不到消息了。
我们上面的场景是观察者模式中的推模式,这种场景是主题主动向观察者推送数据,不管观察者需要不需要。推模式的前提是主题对象知道观察者需要的数据,观察中的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
最后
由于篇幅限制,小编在此截出几张知识讲解的图解
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)]