Oberserver Pattern is really the right answer for three of your 4 use cases.
, :
public interface Core {
sendFiles(List<File> files);
registerProgressListener(ProgressListener listener);
registerStatusListener(StatusListener listener);
registerMessageListener(MessageListener listener);
}
public interface ProgressListener{
madeProgress(ProgressEvent)
}
ProgressEvent ( ) ,
public class ProgressEvent {
public final double progress;
public final String fileName;
public ...
}
, , gui . - . GUI, , , SwingUtilities.invokeLater invokeAndWait GUI.