Tôi có một lớp được gọi là GoogleWeather, tôi muốn chuyển đổi nó sang lớp khác CustomWeather.Mẫu thiết kế để chuyển đổi một lớp học sang một lớp khác
Có mẫu thiết kế nào giúp bạn chuyển đổi lớp học không?
Tôi có một lớp được gọi là GoogleWeather, tôi muốn chuyển đổi nó sang lớp khác CustomWeather.Mẫu thiết kế để chuyển đổi một lớp học sang một lớp khác
Có mẫu thiết kế nào giúp bạn chuyển đổi lớp học không?
Có một quyết định quan trọng để thực hiện:
Bạn có cần các đối tượng đó được tạo ra bởi việc chuyển đổi để phản ánh những thay đổi trong tương lai để các đối tượng nguồn?
Nếu bạn không cần chức năng như vậy, cách tiếp cận đơn giản nhất là sử dụng lớp tiện ích với phương pháp tĩnh tạo đối tượng mới dựa trên các trường của đối tượng nguồn, như đã đề cập trong các câu trả lời khác.
Mặt khác, nếu bạn cần các đối tượng chuyển đổi để phản ánh thay đổi đối với đối tượng nguồn, bạn có lẽ sẽ cần một cái gì đó dọc theo dòng của Adapter design pattern:
public class GoogleWeather {
...
public int getTemperatureCelcius() {
...
}
...
}
public interface CustomWeather {
...
public int getTemperatureKelvin();
...
}
public class GoogleWeatherAdapter implements CustomWeather {
private GoogleWeather weather;
...
public int getTemperatureKelvin() {
return this.weather.getTemperatureCelcius + 273;
}
...
}
tôi không hiểu sự khác biệt giữa bộ điều hợp và ứng dụng bản đồ thế nào là lợi thế của việc sử dụng mẫu bộ điều hợp trong trường hợp này? – user1549004
@ user1549004: Bộ điều hợp là trình bao bọc - tất cả các phương thức được chuyển tiếp đến đối tượng nguồn. Điều đó có nghĩa là mọi bản cập nhật cho đối tượng nguồn, được truyền qua bộ điều hợp. Mặt khác, sử dụng lớp trình ánh xạ là điều một lần - mọi cập nhật đối với nguồn sẽ thường không ảnh hưởng đến kết quả của chuyển đổi. – thkala
bạn có thể vui lòng cho tôi ví dụ khi sử dụng lớp bản đồ trong trường hợp bất kỳ cập nhật nào đối với nguồn không ảnh hưởng đến kết quả của chuyển đổi. – user1549004
Trong trường hợp đó tôi muốn sử dụng một lớp Mapper với một loạt các phương pháp tĩnh:
public final class Mapper {
public static GoogleWeather from(CustomWeather customWeather) {
GoogleWeather weather = new GoogleWeather();
// set the properties based on customWeather
return weather;
}
public static CustomWeather from(GoogleWeather googleWeather) {
CustomWeather weather = new CustomWeather();
// set the properties based on googleWeather
return weather;
}
}
Vì vậy, bạn không phải phụ thuộc giữa các lớp.
mẫu sử dụng:
CustomWeather weather = Mapper.from(getGoogleWeather());
nó là một cách tiếp cận tốt để làm việc với Mapper? – user1549004
Vì lý do, đó là ** cách tiếp cận tốt nhất từ trước đến nay **! (chỉ đùa thôi, nhưng này, tôi sẽ không đề nghị giải pháp xấu ở đây) –
Một điều cần lưu ý: đây là một sự chuyển đổi một lần; các thay đổi trong tương lai trong đối tượng nguồn sẽ không ảnh hưởng đến các trường của đối tượng kết quả. – thkala
Bên cạnh đó, Bạn cũng có thể sử dụng Java8 mới tính năng 'Chức năng' từ java.util.function '.
Giải thích chi tiết hơn được cung cấp trong http://www.leveluplunch.com/java/tutorials/016-transform-object-class-into-another-type-java8/. Vui lòng có một cái nhìn!
đây chỉ là một công cụ chuyển đổi một chiều đơn giản - hợp lệ nhưng bạn có thể thực hiện điều này chính xác theo cùng một cách trong bất kỳ phiên bản Java nào. –
Mẫu trang trí? – assylias
Cấu trúc phân cấp của bạn là gì (CustomWeather có mở rộng GoogleWeather) không? Bạn có ý nghĩa gì khi "chuyển đổi"? – Flawyte
Chuyển đổi như thế nào? Tạo một phân lớp, đổi tên nó, v.v ...? Nó không rõ ràng những gì bạn mong muốn trong lớp "CustomWeather" – russ36363