架构设计之源:设计模式的场景分析(1)Publish-Subscribe
我在设计模式方面仅阅读过英文原版(或影印版)的书籍,以及一些互联网上的资料。而设计模式中有很多专有名词,概因我不知道部分中文译名是什么,所以本文以英文来写作。
1. Motivating Scenario
Have you ever encounter such a scenario: The data generatted by someone should be passed to the rest of others or some others in the program, and every receiver has a similar operation?
I think if you have some experience in software programming, there must be such scenarios. In the DP (Design Pattern) introduced in this article, the data generator or sender is called publisher and the receiver is called subscriber, just as you subscribe a
RSS or a local newspaper and the postman sends those newspaper.
2. Publisher and Subscriber
Here is a Publisher interface. Thesubscribe
method
is used to register a subscriber to the publisher. Thepublish
method
is aimed at sending data to subscribers who have registered before.
// Poechant@CSDN
package com.sinosuperman.main;
public interface Publisher<E> {
public void subscribe(Subscriber<E> subscriber);
public void publish(E data);
}
Subscriber interface is as following. The methodgetPublication
is
invoked by the publisher to run the specific code implements by the subscribers.
// Poechant@CSDN
package com.sinosuperman.main;
public interface Subscriber<E> {
public void getPublication(E data);
}
The natural flow of publish-subscribe pattern
Publish-Subscribe Design Pattern
3. Example
Now we are trying to create a simple command processor, which has some basic functions as echo, quit and map.
3.1. Class implements Publisher
// Poechant@CSDN
package com.sinosuperman.main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class InputLoop implements Publisher<String> {
private List<Subscriber<String>> subscribers;
private InputLoop() {
subscribers = new ArrayList<Subscriber<String>>();
}
public static InputLoop create() {
return new InputLoop();
}
@Override
//register subscriber
public void subscribe(Subscriber<String> subscriber) {
if (!subscribers.contains(subscriber)) {
subscribers.add(subscriber);
}
}
@Override
// Notify all subscribers
public void publish(String data) {
for (Subscriber<String> sub : subscribers) {
sub.getPublication(data);
}
}
public static String getInput() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String response = "";
try {
response = br.readLine();
if (response == null) {
return "";
}
} catch (IOException e) {
}
return response;
}
public void loop() {
while (true) {
System.out.println("> ");
String s = getInput();
publish(s);
}
}
}
3.2. Classes implements Subscriber
Echo class could echo every string you input.
// Poechant@CSDN
package com.sinosuperman.main;
public class Echo implements Subscriber<String> {
private Echo() {
}
public static Echo create() {
return new Echo();
}
@Override
public void getPublication(String data) {
System.out.println("Got: " + data);
}
}
Map class could return the value according to the key you input.
// Poechant@CSDN
package com.sinosuperman.main;
public class Response implements Subscriber<String> {
private String ifthis;
private String thenthat;
private Response(String it, String tt) {
ifthis = it;
thenthat = tt;
}
public static Response create(String it, String tt) {
return new Response(it, tt);
}
@Override
public void getPublication(String data) {
if (data.equals(ifthis)) {
System.out.println(thenthat);
}
}
}
Quit class could execute the exit operation, then the program is halted.
// Poecahnt@CSDN
package com.sinosuperman.main;
public class Quit implements Subscriber<String> {
private Quit() {}
public static Quit create() {
return new Quit();
}
@Override
public void getPublication(String data) {
if (data.equals("quit")) {
System.exit(0);
}
}
}
3.3. Benchmark
Create an object of InputLoop and four subscribers.
package com.sinosuperman.main;
public class Test {
public static void main(String[] args) {
InputLoop il = InputLoop.create();
il.subscribe(Echo.create());
il.subscribe(Quit.create());
il.subscribe(Response.create("foo", "bar"));
il.subscribe(Response.create("1+1", "2"));
il.loop();
}
}
Test:
>
this is a string
Got: this is a string
>
help
Got: help
>
foo
Got: foo
bar
>
1+1
Got: 1+1
2
>
foo
Got: foo
bar
>
quit
Got: quit
-
转载请注明来自Poechant@CSDN
-
分享到:
相关推荐
发布-订阅(Publish-Subscribe)模式是一种消息传递机制,它允许发送者(发布者)与接收者(订阅者)之间进行异步通信。在这种模式下,订阅者通过表达对特定类型信息的兴趣来订阅信息,而发布者则负责提供这些信息。...
- **消息通信模式**:确定消息传递采用何种模式,如单向发送(Send and Forget)、请求/响应(Request/Reply)或发布/订阅(Publish/Subscribe)等。 ##### 2. 非功能性需求 - **扩展性和高可用性**:定义ESB平台...
- 去中心化的架构设计 - 同步各节点的配置信息 - **消息分发机制**: - 一种消息类型对应一个消息队列 - 一个任务可以接收多种消息类型 - 动态配置工作进程的数量 #### 定时任务处理 - **定时器配置**:类似...
发布/订阅系统(Publish/Subscribe System)是一种在分布式计算环境中广泛应用的通信模式,它通过解耦消息发送者(发布者)与接收者(订阅者),实现了高效、灵活的信息传递机制。这种模式尤其适用于大规模应用中,...
- **消息传递系统**:Camel 支持 Point-to-Point 和 Publish-Subscribe 模型,这些模型适用于不同类型的通信需求。 #### 应用场景示例 - **消息汇聚**:将来自不同消息源的数据合并成一个统一的格式,例如将来自 ...
在这个场景中,我们关注的是一个名为"TopicEventBus"的框架,它是一个针对发布-订阅设计模式(Publish-Subscribe Pattern)的实现,提供了类型安全的方式来进行事件处理。这种设计模式允许组件之间松耦合地通信,...
- **LRU**:适合大多数场景,特别是数据访问模式较为规律的情况。 - **LFU**:适用于数据访问频率差异较大的场景。 - **TTL**:适用于数据过期时间固定的场景。 #### 24. Redis 的持久化方式有哪些优点和缺点?...
开源项目"Sauerbraten-pubsub"是一个使用Go语言实现的简单、有立场的发布-订阅(Publish-Subscribe,简称Pub/Sub)包。这个库利用了Go语言的通道(channels)特性来构建高效的事件传递机制,允许不同组件之间进行...
* 事件驱动架构(Event-Driven Architecture):基于事件驱动的架构风格,例如, publish-subscribe 模式等。 * 微服务架构(Microservices Architecture):将系统分解成多个小型服务,例如,API Gateway、Service ...
Oriented Software Architecture: Patterns for Concurrent and Networked Objects, Volume 2》是一部极具价值的专业书籍,它不仅为软件架构师和开发人员提供了丰富的设计模式资源,而且还通过具体的案例分析加深了...
- 包括点对点模型(Point-to-Point, PTP)和发布/订阅模型(Publish/Subscribe, Pub/Sub)两种消息传递模式。 - PTP:每个消息只能被一个消费者接收。 - Pub/Sub:消息可以被多个订阅者接收。 **5. Cookie和...
代理模式分为三种基本类型:请求-响应(Request-Reply)、发布-订阅(Publish-Subscribe)和推拉(Push-Pull)。这些模式都是为了处理分布式系统中的异步通信和数据流控制。 1. 请求-响应模式(Rep-Req): 在这个...
Producers负责发布消息到特定的分区,而Consumers可以从Topic中消费消息,Kafka提供了两种消费模式:Queuing(队列)模式和Publish-Subscribe(发布/订阅)模式,以适应不同的应用场景。 数据预处理是大数据处理的...
MDB的设计模式符合面向消息中间件(Message-Oriented Middleware, MOM)的概念,允许应用程序之间通过消息进行通信,而无需直接互相了解。 2. **EJB架构与MDB**: EJB架构包含三种类型的bean:Session Beans(无...
- **DCPS** (Data-Centric Publish-Subscribe): OpenDDS的核心是DCPS模型,这是一种基于数据的发布订阅模型。 - **内置主题** (Built-In Topics): OpenDDS提供了一系列预先定义的主题,如类型注册主题、参与者状态...
- **MQTT客户端:** 负责发布消息(Publish)和订阅消息(Subscribe)。 - **MQTT服务器(Broker):** 作为中间件接收客户端发布的消息,并将消息转发给订阅相应主题的客户端。 #### 三、ECU-1251 MQTT功能测试...
EIP 提供了一系列的模式和架构风格,以帮助开发人员和架构师设计和实现高效、可靠和可扩展的企业集成解决方案。 EIP 的核心概念包括: 1. 集成风格:文件传输、共享数据库、远程过程调用和消息传递等。 2. 消息...
8. **QoS Level-1 消息发布 (PUBLISH with QoS Level-1):** 支持至少一次传递的服务质量。 9. **客户端订阅/取消订阅过程 (Client’s Topic Subscribe/Un-subscribe Procedure):** 客户端可以订阅或取消订阅特定...
设计模式是在特定场景下解决常见问题的标准化方法,Java中有23种经典的设计模式。 - **常用模式**: - 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。 - 工厂模式(Factory):定义创建...