我有一个生产者,它获取数据A,产生数据B,并将其发送出去
public interface Producer<T>{
void produce(T data);
void flush();
}
public class DataBaseProducer implements Producer<String>{
List<String> producedData = new ArrayList<>();
// create data
public void produce(String data){
producedData.add(transformData(data));
}
// send created data
public void flush(){
sendDataToDatabase(producedData);
}
}
public class MessageProducer implements Producer<String>{
public void produce(String data){
String line =transformData(data)
sendDataToMessageQueue(line);
}
public void flush(){
}
}
public static void main(String[] args) {
// get producer
Producer producer = getProducer(producerName)
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(file..));
String line = reader.readLine();
while (line != null) {
producer.produce(line)
line = reader.readLine();
}
reader.close();
producer.flush()
} catch (IOException e) {
e.printStackTrace();
}
}
为了证明我的问题,想象一下我有像上面这样的制作人。一个加载所有数据,然后在完成后立即批量发送,第二个立即发送数据(因此它不批量发送数据,但每当有新数据时,createdit立即发送)
大多数生产者会在每加载一个数据之后发送数据,但很少有人会马上发送。如果生产者立即发送数据,则flush()
方法将保持为空。然而,这似乎是一种糟糕的做法,可能违反了一些OOP原则。对此,正确的实施方式是什么?
谢谢你的回答!
在我看来,并且在检查了main()
代码之后,我认为MessageProducer
并不是真正的生产者
,因为Producer
方法实际上是同时生成
和刷新
。
但是,由于您似乎需要以相同的方式独立地对待从getProducer(producerName)
获得的内容,那么您可以做的事情如下所示:
public class MessageProducer implements Producer<String> {
private boolean flushNeeded;
private String line;
public void produce(String data){
line =transformData(data)
flushNeeded = true;
flush();
}
public void flush(){
if (flushNeeded) {
sendDataToMessageQueue(line);
flushNeeded = false;
}
}
}
但在我的浅见中,这与让flush()
实现为空并没有什么显著的区别,如果不是为了让代码对读者更清楚一点的话(读取一个空的flush()
实际上可能会错误地认为您的实现从未刷新,而它确实刷新了,但只是进入了produce
方法)。
本文向大家介绍C#判断一个类是否实现了某个接口3种实现方法,包括了C#判断一个类是否实现了某个接口3种实现方法的使用技巧和注意事项,需要的朋友参考一下 B为一个类,ISay为一个接口。 方法1: 方法2: 方法3:
问题内容: 具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何确定哪个方法用于哪个接口? 例如: 问题答案: 如果一个类型实现两个接口,并且每个接口定义一个具有相同签名的方法,则实际上只有一个方法,并且它们是不可区分的。例如,如果这两个方法的返回类型冲突,那么它将是编译错误。这是继承,方法重写,隐藏和声明的一般规则,并且不仅适用于两个继承的interface方法之间的可能冲突,还
本文向大家介绍实现一个isNaN的方法相关面试题,主要包含被问及实现一个isNaN的方法时的应答技巧和注意事项,需要的朋友参考一下
我有几个Java类,它们扩展了泛型列表接口的各种实现。它们只需记录添加到列表中的任何内容。 LoggingArrayList如下所示。顾名思义,它扩展了ArrayList。LoggingLinkedList类完全相同,只是它扩展了LinkedList。 我的主要目标是避免重复所有的公共代码,这样我就可以使用不同的基类。我在尽量坚持干巴巴的原则(不要重复你自己)。 首先,请不要建议更好的登录方式。那
类具有可以是两种类类型之一的属性,这就是为什么我试图创建类类型实现的接口 所以我不能使用目标实体,因为这两个类都可以使用。下面是错误堆栈:org.hibernate。AnnotationException:model.User中的未知mappedBy。登录时,引用的属性未知:model.login.user。请帮帮我
问题内容: 此代码完美地工作。方法test()适用于两个接口。幕后到底发生了什么?在实际情况下,此功能有何用处? 问题答案: 因为它是一个接口,所以不会造成任何危害。通过实现和,您基本上是在为您的课程使用蓝图。双方并说,应实施一个名为方法 您的类实现了该方法,因此接口已完成其工作。 基本上,您的班级在说:“哦,我需要因为接口而实现”,然后您就实现了。然后您的班级说:“哦,嘿,由于接口我需要再次实现