我目前正致力于通过不同网络与系统中的其他应用程序进行通信的应用程序。目前,它通过DIS以及RabbitMQ进行通信。但是,在内部,应用程序并不关心谁发送了消息或以何种格式发送消息。
考虑到这一点,我创建了一个抽象类,其中包含名为InternalMessage的信息,以及一个用于发送和接收这些消息的抽象类OrchestrationMessenger。应用程序轮询Messengers以获取传入消息并发回响应。但是,向网络发送消息的过程发生在类的内部,并且依赖于扩展InternalMessage的Concrete类。
我知道每个Concrete类需要的函数,但只在内部使用,是否应该在Abstract类中声明?我理解如何来声明方法,我只是不知道我应该。
例如:将传入消息转换为内部格式的功能,反之亦然,从网络读取传入消息,并发送传出消息。
抽象信使:
//Package omitted
import java.util.Queue;
//Comments omitted
public abstract class OrchestrationMessenger <M extends InternalMessage> implements Runnable
{
protected Queue<M> incoming, outgoing;
//Send out a Message, such as responses or commands
public void publish(M message)
{
outgoing.add(message);
}
//Receive next incoming Message Object
public M process()
{
return incoming.poll();
}
//Check if there are any Messages to process
public boolean hasNext()
{
return !incoming.isEmpty();
}
}
谢谢!
答案 0 :(得分:2)
我知道每个Concrete类所需的函数是否需要,但是 只会在内部使用,在Abstract类中声明?
要回答这个问题,您必须考虑是否只有具体的子类才需要此方法。
例如,您有一个班级Person
,而Person
的每个子班级都需要一个常用的方法,即calculateWeight
,它会返回Person
的权重。您必须说每个Person
都有相同的方法来执行此操作。但是,其他Object
说Animal
还需要相同的方法来计算动物的体重。请注意,该方法的要求不仅限于子类。那么它不应该在abstact
类中。它应该是实用方法,否则在abstract
父项中具有通用实现是可以的。
答案 1 :(得分:1)
如果您只是使用或不使用这些方法来决定是否应该将它们声明为抽象,那么这无关紧要。
如果抽象类的每个子类都需要这个方法,并且每个子类都有它的特定实现(所以它需要在具体的子类中实现),那么添加它可能是一个好主意它们作为抽象类的抽象方法。
这样,您可以确定,所有实现都有这些方法,这可以帮助您获得更清晰的类模型和更少的冗余(如果不是现在,那么肯定将来)。