Другой метод заключается в создании набора классов, который выполняет задачу и возвращает набор значений, которые затем можно либо записать на диск, либо отобразить в графическом интерфейсе. То есть двигатель и два интерфейса (GUI и CLI).
например:
public interface DirectoryComparer {
CompareResult performCompare(Directory dir1, Directory dir2);
public static interface CompareResult {
//...things here that you need, such as, file or dir difference, etc
Iterable<File> getFileDiff();
Iterable<Directory> getDirectoryDiff();
}
}
тогда клиенты с графическим интерфейсом просто будут использовать DirectoryComparer
для отображения результатов, а клиент CLI запишет эти результаты в файл или три. Но эти два клиента полностью разделены и могут обслуживаться отдельно.