2012-08-06 23 views
28

GoogleWeather adında bir dersim var, bunu başka bir sınıfa CustomWeather olarak dönüştürmek istiyorum.Sınıfı başka bir dile dönüştürmek için tasarım deseni

Sınıfları dönüştürmenize yardımcı olan herhangi bir desen var mı?

+0

Dekoratör kalıbı? – assylias

+0

Hiyerarşiniz nedir (CustomWeather, GoogleWeather'ı genişletir)? "Dönüştürme" ile ne demek istiyorsun? – Flawyte

+0

Nasıl dönüştürülür? Bir alt sınıf oluşturmak, yeniden adlandırmak, vb? GoogleWeather ve CustomWeather – russ36363

cevap

34

yapmak için bir kritik karar yok:

kaynak nesnesine gelecek değişiklikleri yansıtacak şekilde dönüştürülmesi ile oluşturulduğu nesne gerekir mi?

Böyle bir işleve ihtiyacınız yoksa, en basit yaklaşım, diğer yanıtlarda belirtildiği gibi kaynak nesnenin alanlarına dayalı yeni bir nesne oluşturan statik yöntemlerle bir yardımcı program sınıfı kullanmaktır.

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

kullanarak yapma) adaptör ve mapper appproche arasındaki farkın ne anlama geldiğini anlamadım. Bu durumda adaptör modeli? – user1549004

+2

@ user1549004: Bağdaştırıcı bir sarıcıdır - tüm yöntemler kaynak nesneye iletilir. Bu, kaynak nesneye yapılan tüm güncellemelerin adaptör aracılığıyla yayıldığı anlamına gelir. Öte yandan, bir eşleme sınıfı kullanmak tek seferlik bir şeydir - kaynağa yapılan tüm güncellemeler genellikle dönüşümün sonucunu etkilemez. – thkala

+0

kaynağında yapılan herhangi bir güncellemenin, dönüşümün sonucunu etkilememesi durumunda, bir mapper sınıfı kullanırken bana bir örnek verebilir misiniz? – user1549004

37

Bu durumda ben statik yöntemlerin bir grup ile bir Mapper sınıfını kullanırsınız:

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; 
    } 
} 

Yani sınıflar arasındaki bağımlılıkları yoktur.

Örnek kullanım:

CustomWeather weather = Mapper.from(getGoogleWeather()); 
+1

arasında "CustomWeather" sınıfındaki – user1549004

+4

Nedeni, bu ** en iyi yaklaşımdır **! (sadece şaka, ama hey, burada kötü çözümler önermem) –

+2

Dikkat edilmesi gereken bir şey: bu bir defalık dönüşümdür; Kaynak nesnedeki gelecekteki değişiklikler, ortaya çıkan nesnenin alanlarını etkilemez. – thkala

2

yanında Ayrıca yeni Java8 kullanabilirsiniz: Eğer kaynak nesnesine değişiklikleri yansıtacak şekilde dönüştürülen nesne gerekiyorsa Öte yandan

, muhtemelen Adapter design pattern çizgisinde bir şey gerekir java.util.function 'dan' İşlev 'özelliği.

Daha ayrıntılı açıklama http://www.leveluplunch.com/java/tutorials/016-transform-object-class-into-another-type-java8/ adresinde verilmektedir. Lütfen bir göz var!

+1

Bu sadece basit bir tek yönlü dönüştürücüdür - geçerli ancak bunu herhangi bir Java sürümünde tam olarak aynı şekilde uygulayabilirsiniz. –

İlgili konular