/**
* Java8函数对模板方法的改造
* 1:
* 使用模板方法实现下载:
*/
public class ExportFile {
public static void main(String[] args) throws Exception {
Exporter userExporter = new UserExporter();
userExporter.exportFile("user");
Exporter orderExporter = new OrderExporter();
orderExporter.exportFile("order");
}
}
abstract class Exporter {
public File exportFile(String fileName) throws Exception {
File file = new File("export/" + fileName);
try (Writer writer = new FileWriter(fileName)) {
writerContent(writer);
return file;
} catch (Exception ex) {
System.out.println(ex.getMessage());
throw ex;
}
}
abstract void writerContent(Writer writer) throws IOException;
}
class OrderExporter extends Exporter {
@Autowired
private OrderRepo orderRepo;
void writerContent(Writer writer) throws IOException {
writer.write("ID;Date\n");
orderRepo.findByActiveTrue().stream()
.map(e -> e.getId() + ";" + e.getDate())
.forEach(Unchecked.consumer(writer::write));
}
}
class UserExporter extends Exporter {
@Autowired
private UserRepo userRepo;
void writerContent(Writer writer) throws IOException {
writer.write("ID;Date\n");
userRepo.findByActiveTrue().stream()
.map(e -> e.getId() + ";" + e.getDate())
.forEach(Unchecked.consumer(writer::write));
}
}
interface OrderRepo {
List findByActiveTrue();
}
@Data
class Order {
private String id;
private String Date;
}
interface UserRepo {
List findByActiveTrue();
}
@Data
class User {
private String id;
private String date;
}
/**
* Java8函数对模板方法的改造
* 2:
* 使用模板方法实现下载:
* 解决的问题:解耦导出类和业务类的继承关系耦合
* 思考:被抽离出来的公共部分函数void writerContent(Writer writer),
* 其实质是接收一个Writer,没有返回值,此时考虑用Consumer函数进行替换
*/
public class ExportFile {
public static void main(String[] args) {
Exporter exporter = new Exporter();
UserExporter userExporter = new UserExporter();
exporter.exportFile("user",userExporter::writerContent);
OrderExporter orderExporter = new OrderExporter();
exporter.exportFile("order",orderExporter::writerContent);
}
}
class Exporter {
@SneakyThrows
public File exportFile(String fileName, Consumer exportConsumer) {
File file = new File("export/" + fileName);
try (Writer writer = new FileWriter(fileName)) {
exportConsumer.accept(writer);
return file;
} catch (Exception ex) {
System.out.println(ex.getMessage());
throw ex;
}
}
}
class OrderExporter {
@Autowired
private OrderRepo orderRepo;
@SneakyThrows
void writerContent(Writer writer){
writer.write("ID;Date\n");
orderRepo.findByActiveTrue().stream()
.map(e -> e.getId() + ";" + e.getDate())
.forEach(Unchecked.consumer(writer::write));
}
}
class UserExporter {
@Autowired
private UserRepo userRepo;
@SneakyThrows
void writerContent(Writer writer){
writer.write("ID;Date\n");
userRepo.findByActiveTrue().stream()
.map(e -> e.getId() + ";" + e.getDate())
.forEach(Unchecked.consumer(writer::write));
}
}
interface OrderRepo {
List findByActiveTrue();
}
@Data
class Order {
private String id;
private String Date;
}
interface UserRepo {
List findByActiveTrue();
}
@Data
class User {
private String id;
private String date;
}