2012-08-06 31 views
28

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?

+0

Mẫu trang trí? – assylias

+0

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

+0

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

Trả lời

34

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; 
    } 
    ... 
} 
+0

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

+2

@ 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

+0

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

37

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()); 
+1

nó là một cách tiếp cận tốt để làm việc với Mapper? – user1549004

+4

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) –

+2

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

2

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!

+1

đâ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. –

Các vấn đề liên quan